动态规划---01背包问题

时间:2021-12-19 19:09:16

有n个物品,每个物品的重量放在数组weight[]中,每个物品对应的价值放在数组value[]中

有一个背包,容量为target,往背包里装上述n个物品,背包能容纳的最大价值

思路:对于每一个物品,要么装入背包,要么不装入背包

   对于第i个物品,如果它的重量weight[i-1]小于等于背包的容量,它才有可能被装入,如果weight[i-1]大于等于背包的容量,不可能被装入

      创建一个二维数组int[][] m = new int[n+1][target+1];,m[i][j]表示,对于第i个物品,当背包容量为j时,获得的最大价值

public static int ZeroOnePackage2(int []value, int[] weight, int target){
        int max = 0;
        if(value!=null && value.length>0 && weight!=null && weight.length>0 && weight.length == value.length && target>0){
            int n = value.length;
            int[][] m = new int[n+1][target+1];
            for(int i=1;i<=n;i++){
                for(int j=1;j<=target;j++){
                    if(weight[i-1] > j){
                        m[i][j] = m[i-1][j];
                    }else{
                        m[i][j] = Math.max(m[i-1][j], m[i-1][j-weight[i-1]]+value[i-1]);
                    }
                    if(max>m[i][j]){
                        max = m[i][j];
                    }
                }
            }
            for(int i=0;i<m.length;i++){
                for(int j=0;j<m[i].length;j++){
                    System.out.print(m[i][j]+" ");
                }
                System.out.println();
            }
        }
        
        return max;
        
    }