下面是我记忆的0-1背包问题的方法代码,它显示了我从yt学习的一个很长的案例,并且做了这个,但是没有发现任何错误,有人能给我解释一下吗?
#include <bits/stdc++.h>
using namespace std;
int dp[1005][1005];
int max(int a,int b){
return a > b ? a : b;
}
int knapsack(int val[],int wt[],int w,int n){
if(n==0 || w==0)
return 0;
if(dp[n][w] != -1)
return dp[n][w];
if(wt[n-1]<=w)
return dp[n][w] = max( val[n-1] + knapsack(val,wt,w-wt[n-1],n-1) , knapsack(val,wt,w,n-1) );
else if(wt[n-1]>w)
return dp[n][w] = knapsack(val,wt,w,n-1);
}
int main() {
memset(dp,-1,sizeof(dp));
int t;
cin>>t;
while(t--){
int n,w;
cin>>n>>w;
int val[n],wt[n];
for(int i=0;i<n;i++)
cin>>val[i];
for(int i=0;i<n;i++)
cin>>wt[i];
cout<<knapsack(val,wt,w,n)<<"\n";
}
return 0;
}
一些破坏代码的示例输入
2
1 100
10 100
1 100
20 100
两次测试,都有100的限制,有一个重量,也是100。 这两个测试的唯一区别是,权重在第一个测试中具有值10,而在第二个测试中具有值20。 您的代码为第一个测试输出10(正确),为第二个测试输出10(不正确)。
显然,问题是您在第二个测试中重用了从第一个测试中收集的结果,即使第二个测试的参数不同。
将memset
移动到测试循环中,使其重置记录的值,每个测试修复了这个问题。