【问题标题】:0-1 Knapsack implementation yielding wrong answer0-1 背包实现产生错误答案
【发布时间】:2015-03-22 11:17:57
【问题描述】:

我已经添加了背包问题的递归和 DP 的实现。我在其中找不到错误。请帮忙。

import java.util.Scanner;


public class Knapsac {

    static int[][] dp;

    static int knapsack(int[] size,int[] value, int i, int weight){
        if(i <= 0)
            return 0;
        if(weight < 0)
            return Integer.MIN_VALUE;
        if(dp[weight][i] != -1)
            return dp[weight][i];

        dp[weight][i] = Math.max(knapsack(size, value, i-1, weight - size[i]) + value[i], knapsack(size, value, i-1, weight));
        return dp[weight][i];
    }

    static int knapsackWithoutDP(int[] size, int[] value, int i, int weight){
        if(i <= 0)
            return 0;
        if(weight < 0)
            return Integer.MIN_VALUE;
        return Math.max(knapsackWithoutDP(size, value, i-1, weight - size[i]) + value[i], knapsackWithoutDP(size, value, i-1, weight));
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int W, n;
        Scanner in = new Scanner(System.in);
        W = in.nextInt(); n = in.nextInt();
        dp = new int[W+1][n];

        for(int i = 0; i < W+1; i++)
            for(int j = 0; j < n; j++)
                dp[i][j] = -1;


        int[] size = new int[n], value = new int[n];
        for(int i = 0; i < n; i++){
            size[i] = in.nextInt();
            value[i] = in.nextInt();
        }

        System.out.println(knapsackWithoutDP(size, value, size.length-1,  W));
        System.out.println(knapsack(size, value, size.length-1,  W));
    }

}

我正在处理测试用例

4 5
1 8
2 4
3 0
2 5
2 3

我应该都得到 13,但我得到了 12。

有人可以帮我理解我的实现中的错误吗?

【问题讨论】:

    标签: java algorithm dynamic-programming knapsack-problem


    【解决方案1】:

    问题似乎是您无法选择子集的第一个元素:

    if(i <= 0)
         return 0;
    

    但这意味着如果要包含或排除索引为0 的项目,则无法达到您选择的地步,这是您可以选择的第一个元素。 (value[0],weight[0] 是添加到背包的有效选择)

    快速解决方法是简单地将这个停止子句更改为

    if(i < 0) //strictly smaller than
         return 0;
    

    【讨论】:

    • 这给了我 17。正确答案是 13。我之前尝试过,但一直保持这种方式,因为这给了我更接近的答案
    【解决方案2】:

    我修好了,我不得不将重量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 2018-03-27
      • 2015-08-21
      • 2011-12-18
      相关资源
      最近更新 更多