我正在解决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,如评论中所示。