C++ 0-1背包C和x2B+;没有返回正确的值 #包括 使用名称空间std; 整数背包(整数val[],整数wt[],整数W,整数n) { int dp[n+1][W+1]; 对于(int i=0;i

C++ 0-1背包C和x2B+;没有返回正确的值 #包括 使用名称空间std; 整数背包(整数val[],整数wt[],整数W,整数n) { int dp[n+1][W+1]; 对于(int i=0;i,c++,knapsack-problem,C++,Knapsack Problem,您在检查i==0 | | j==0后忘记了else,因此读取超出范围的值 #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|

您在检查
i==0 | | j==0
后忘记了
else
,因此读取超出范围的值

#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);
}
if(i==0 | | j==0)
dp[i][j]=0;

否则,当
i==0
时,如果(wt[i-1]使用
[i-1]
是危险的。
            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];