题目传送门:https://vjudge.net/problem/HDU-2602
两种都可以
for(i = n; i >= 1; i--)
{
for(j = 0; j <= ww; j++)
{
if(j < w[i])
dp[i][j] = dp[i + 1][j]; //第i个物品放入后,因为剩余空间不够无法放入。
else
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j - w[i]] + mon[i]); //表示第i个物品将放入大小为j的背包中。
}
}
或
for(int i = 1; i <= n; i++)
{
for(int j = 0; j <= ww; j++)
{
if(j < w[i])
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + mon[i]);
}
}
完整代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
int dp[1005][1005];
int main()
{
int t, n, ww, i, j;
int mon[1005], w[1005];
cin >> t;
while(t--)
{
cin >> n >> ww;
memset(dp, 0, sizeof(dp));
for(i = 1; i <= n; i++)
cin >> mon[i];
for(i = 1; i <= n; i++)
cin >> w[i];
for(i = n; i >= 1; i--)
{
for(j = 0; j <= ww; j++)
{
if(j < w[i])
dp[i][j] = dp[i + 1][j];
else
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j - w[i]] + mon[i]);
}
}
cout<<dp[1][ww]<<endl;
}
return 0;
}