01背包问题动态规划


#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<vector>
using namespace std;

typedef long long int LL;
typedef long double LD;

const int N =3e4+10;
int n,m;
int dp[100][30];

struct node {
    int v;
    int p;
}a[N];

void solve()
{
     memset(dp, 0, sizeof(dp));
    for (int i = 1;i <= m;i++) {
        for (int j = 1;j<=n;j++) {
            if (a[i].v <=j) {
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - a[i].v] + a[i].p);
            }
            else
                dp[i][j] = dp[i - 1][j];
            cout << dp[i][j] << " ";
        }
        cout << endl;
    }
    cout << dp[m][n] << endl;
}

int main()
{
    cin >> n >> m;
    for (int i = 1;i <= m;i++) {
        cin >> a[i].v >> a[i].p;
    }
    solve();
    return 0;
}

运行上面这个代码,正常输出不是为3吗,怎么突然跑出来个4.

img

可以稍微提示你一下当 i==3 j==1 时,dp数组情况如下:
dp[i][j]==2 i=3 j=1


0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 1 1
2 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


你可以找找什么问题

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^