提问者:小点点

有人帮我写这段代码吗?我对此感到很失望


下面是我记忆的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;
}

共1个答案

匿名用户

一些破坏代码的示例输入

2
1 100
10 100
1 100
20 100

两次测试,都有100的限制,有一个重量,也是100。 这两个测试的唯一区别是,权重在第一个测试中具有值10,而在第二个测试中具有值20。 您的代码为第一个测试输出10(正确),为第二个测试输出10(不正确)。

显然,问题是您在第二个测试中重用了从第一个测试中收集的结果,即使第二个测试的参数不同。

memset移动到测试循环中,使其重置记录的值,每个测试修复了这个问题。