zoukankan      html  css  js  c++  java
  • Java01背包改进

    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,2,4,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();
         }
    }
  • 相关阅读:
    SDUT-3376_数据结构实验之查找四:二分查找
    SDUT-3375_数据结构实验之查找三:树的种类统计
    SDUT-3373_数据结构实验之查找一:二叉排序树
    深度优先遍历和广度优先遍历
    SDUT-2498_AOE网上的关键路径
    SDUT-2140_判断给定图是否存在合法拓扑序列
    SDUT-2144_最小生成树
    SDUT-3364_欧拉回路
    SDUT-3363_驴友计划
    Java练习 SDUT-2271_Eddy的难题
  • 原文地址:https://www.cnblogs.com/z2529827226/p/11624375.html
Copyright © 2011-2022 走看看