模板

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

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;
}
posted on 2025-12-05 22:05  Hoshino1  阅读(2)  评论(0)    收藏  举报