模板
相当于我们遍历每个物品,然后求他在各个容量下的最有价值
然后第二个物品,当容量为j时,他需要前一个商品预留w[i]

https://www.luogu.com.cn/problem/P1048
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int t, m;
const int maxn = 1100;
int dp[maxn][maxn];
int w[maxn];
int v[maxn];
signed main()
{
cin >> t >> m;
for (int i = 1;i <= m;i++)cin >> w[i] >> v[i];
for (int i = 1;i <= m;i++)
{
for (int j = t;j >=0;j--)
{
//可以取等
if (j >= w[i])
{
//j 代表“假设当前背包的总容量是 j
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
}
else
{
dp[i][j] = dp[i - 1][j];
}
}
}
// dp[m][t]的定义就是“在前 m 个物品中,背包容量为 t 时的最大价值”。由于我们的状态转移包含了“不装”的情况(继承了 dp[i-1][j])
// ,所以 dp[m][t] 本身就已经是考虑了所有可能容量(0到t)后的全局最优解了。
cout << dp[m][t] << endl;
return 0;
}
浙公网安备 33010602011771号