SC.2 2021-06-19 23:02 采纳率: 0%
浏览 20
已结题

01背包一维数组代码

public class t1_01backpack {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int num=input.nextInt();//物品的数量
        int capacity=input.nextInt();//背包的容量
        int[] w=new int[num+1];//物品的重量
        int[] v=new int[num+1];//物品价值
        for (int i = 1; i < num+1; i++) {
            w[i]=input.nextInt();
            v[i]= input.nextInt();
        }
        int[] dp=new int[capacity+1];
        for (int i = 1; i < num+1; i++) {
            for (int j = capacity; j >=0 ; j--) {
                 if (j>w[i]){
                     dp[j]=Math.max(dp[j],dp[j-w[i]]+v[i]);
                 }
            }
        }
        System.out.println(dp[capacity]);
    }
}

输出的结果和二维数组的结果不一样,请大佬们看看是哪里的代码出问题了

下面是能输出正确结果的二维数组代码

public class backpack {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int num= input.nextInt();//物品的数量
        int capacity= input.nextInt();//背包容量
        int[] w=new int[num+1];//物品体积
        int[] v=new int[num+1];//物品价值
        for (int i=1;i<num+1;i++){
            w[i]= input.nextInt();
            v[i]= input.nextInt();
        }
        int[][] dp=new int[num+1][capacity+1];
        for (int i = 1; i < num+1; i++) {
            for (int j = 1; j < capacity+1; j++) {
                if (w[i]>j){
                    dp[i][j]=dp[i-1][j];
                }else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
                }
            }
        }
        System.out.println(dp[num][capacity]);
    }
}
  • 写回答

2条回答 默认 最新

  • 关注
    for (int i = 1; i < num+1; i++) {
                for (int j = capacity; j >=0 ; j--) {
                     if (j>w[i]){
                         dp[j]=Math.max(dp[j],dp[j-w[i]]+v[i]);
                     }
                }
            }

    这里j的循环改成和下面的一样再运行试试

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月29日