加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java01背包改进

发布时间:2020-12-15 07:28:51 所属栏目:Java 来源:网络整理
导读:package dp; class dpArray{ private int dp[][]; private int w[]; private int v[]; private int memo[]; public int res(){ for ( int i=1;i=4;++ i){ for ( int j=1;j=7;++ j){ if (j w[i]){ dp[i][j] =dp[i-1 ][j]; /** * 比如在这里对于每种物品背包的
package dp;


class dpArray{
    private int dp[][];
    private int w[];
    private int v[];
    private int memo[];

    public int res(){

        for(int i=1;i<=4;++i){
            for(int j=1;j<=7;++j){
                if(j<w[i]){
                 dp[i][j]=dp[i-1][j];
                 /**
                  * 比如在这里对于每种物品背包的容量都从1到最大去比较,为无后效性
                  */
                }
                else{
                    dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
                     /**
                       * 相互独立又有联系
                       */
                }
            }
        }
        return 0;
    }

    public dpArray(){
        w=new int[]{0,2,5,4,7};
        v=new int[]{0,3,1};
        dp=new int[6][9];
        memo=new int[6];
        /**
         * 数组在进行定义是就被初始化为0
         * dp数组的横向表示背包的容量
         * dp数组的纵向表示物品
         * 无后效性,以后dp数组中的值只与之前的值有关与之前的值是怎么得到的无关,换句话说就是之前的值的确定过程不会
         * 对以后值的确定过程造成影响
         */
    }

    public boolean printdp(){
        for(int i=1;i<5;++i){
            for(int j=1;j<8;++j){
              System.out.print(dp[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println();
        for(int i=0;i<5;++i){
            System.out.print(memo[i]);
        }
        return true;
    }

    /**
         * 两种情况:选择与没有选择
         * dp[x][y]==dp[x-1][y]:没有选择,直接跳到它的上面memo数组不变
         * dp[x][y]==dp[x-1][y-w[x]]+v[x]:memo数组做出标记1
         * x==0:容量为0时结束循环
         */

   public void findWhat(int i,int j) {                //最优解情况
        if (i > 0) {
            if (dp[i][j] == dp[i - 1][j]) {
                memo[i] = 0;
                findWhat(i - 1,j);
            }
            else if (j - w[i] >= 0 && dp[i][j] == dp[i - 1][j - w[i]] + v[i]) {  //dp[i - 1][j - w[i]] + v[i]表示上一次的价值加上这次加上物品的价值的总价值
                memo[i] = 1;
                findWhat(i - 1,j - w[i]);
            }
        }
    }
}


public class Mainx {
      public static void main(String[] args) {
          dpArray space= new dpArray();
           space.res();
           space.findWhat(4,7);
           space.printdp();
     }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读