0-1背包实施产生了错误的答案

时间:2015-03-22 11:17:57

标签: java algorithm dynamic-programming knapsack-problem

我添加了我的背包和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分。

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

2 个答案:

答案 0 :(得分:1)

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

if(i <= 0)
     return 0;

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

快速修复只是将此停止子句更改为

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

答案 1 :(得分:1)

我修好了,我不得不改变体重&lt; 0至重量&lt; 1,因为包的容量最小为1。

相关问题