0-1 Knapsack C++ 没有返回正确的值
0-1 Knapsack C++ not returning proper value
#include<bits/stdc++.h>
using namespace std;
int knapsackTab(int val[],int wt[], int W, int n)
{
int dp[n+1][W+1];
for(int i=0;i<n+1;i++){
for(int j=0;j<W+1;j++){
if(i==0||j==0)
dp[i][j]=0;
if(wt[i-1]<=j)
dp[i][j] = max(val[i-1] + dp[i-1][j-wt[i-1]],dp[i-1][j]);
else
dp[i][j] = dp[i-1][j];
}
}
return dp[n][W];
}
int main()
{
int val[] = { 10, 20, 30 };
int wt[] = { 1, 1, 1 };
int W = 2;
int n = sizeof(val) / sizeof(val[0]);
cout<<knapsackTab(val,wt,W,n);
}
输出是一个巨大的数字。我认为它是垃圾值。
预期输出:50
请帮助我并告诉我我可能在哪里犯了错误
您在 i==0||j==0
检查后忘记了 else
,因此读取了超出范围的值。
if(i==0||j==0)
dp[i][j]=0;
else if(wt[i-1]<=j) // add "else" here
dp[i][j] = max(val[i-1] + dp[i-1][j-wt[i-1]],dp[i-1][j]);
else
dp[i][j] = dp[i-1][j];
#include<bits/stdc++.h>
using namespace std;
int knapsackTab(int val[],int wt[], int W, int n)
{
int dp[n+1][W+1];
for(int i=0;i<n+1;i++){
for(int j=0;j<W+1;j++){
if(i==0||j==0)
dp[i][j]=0;
if(wt[i-1]<=j)
dp[i][j] = max(val[i-1] + dp[i-1][j-wt[i-1]],dp[i-1][j]);
else
dp[i][j] = dp[i-1][j];
}
}
return dp[n][W];
}
int main()
{
int val[] = { 10, 20, 30 };
int wt[] = { 1, 1, 1 };
int W = 2;
int n = sizeof(val) / sizeof(val[0]);
cout<<knapsackTab(val,wt,W,n);
}
输出是一个巨大的数字。我认为它是垃圾值。 预期输出:50
请帮助我并告诉我我可能在哪里犯了错误
您在 i==0||j==0
检查后忘记了 else
,因此读取了超出范围的值。
if(i==0||j==0)
dp[i][j]=0;
else if(wt[i-1]<=j) // add "else" here
dp[i][j] = max(val[i-1] + dp[i-1][j-wt[i-1]],dp[i-1][j]);
else
dp[i][j] = dp[i-1][j];