无法找出这个背包代码中的错误?

时间:2015-07-13 17:04:58

标签: algorithm dynamic-programming knapsack-problem

我正在解决this个问题。已经3天了,我无法调试。我的解决方案完美地给出了最佳值,但是没有正确地确定放在背包中的物品以获得最佳值。我用来存储产生最佳解决方案的项目的逻辑非常受欢迎,但对我来说却没有用。我的代码在spoj页面上执行给定的测试用例。但是对于这个特定的

失败了
7 2
6 1
5 1

我的回答:6 1 正确答案:5 1

这是代码

#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;

int max(int a, int b)
{
    return a>b?a:b;
}


long knapsack(int n, int wt[], int value[], int W)
{
    int i, w, keep[n+1][W+1];
    long long dp[n+1][W+1];
    for(i=0;i<=n;i++)
    {
        dp[i][0] = 0;
        keep[i][0] = 0;
    }
    for(i=1;i<=W;i++)
    {
        dp[0][i] = 0;
        keep[0][i] = 0;
    }

    for(i=1;i<=n;i++)
    {
        for(w=1;w<=W;w++)
        {
            if(wt[i] <= w)
                dp[i][w] = max(value[i] + dp[i-1][w-wt[i]], dp[i-1][w]);

            else
                dp[i][w] = dp[i-1][w];
        }
    }

   for(i=0;i<=n;i++)
    {
        for(w=0;w<=W;w++)
        {
            cout << dp[i][w] << " ";
        }
        cout << "\n";
    }

    int k=W, sumw=0, sumv=0; i=n;

    while(i>0 && k>0)
    {
        if(dp[i][k]!=dp[i-1][k])
        {
            cout << "item: " << i << " taken " << "\n";
            sumw = sumw + wt[i];
            sumv = sumv + value[i];
            k = k-wt[i];
            i = i-1;
        }
        else
            i=i-1;
    }

    cout << sumw << " " << sumv << "\n";



}

int main()
{
    int items, i, W;
    cin >> W;
    cin >> items;
    while(W!=0 && items!=0)
    {
        int wt[items+1], value[items+1];
        for(i=1; i<=items; i++)
            cin >> wt[i] >> value[i];
        knapsack(items, wt, value, W);
        cin >> W >> items;

    }
}

如果您有任何想法,请帮我调试一下?非常感谢!

PS:有许多具有完全相同错误的欺骗用户,因为他们正在获得WA,如评论中所示。

0 个答案:

没有答案