专栏文章
题解:P1060 [NOIP2006 普及组] 开心的金明
P1060题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miqi2631
- 此快照首次捕获于
- 2025/12/04 05:09 3 个月前
- 此快照最后确认于
- 2025/12/04 05:09 3 个月前
solution
01 背包问题。
记 表示 ,即物品 占用的背包容量,设 表示前 个物品容量为 的背包的最大价值。
考虑转移。假设当前已经处理好了前 个物品的所有状态,那么对于第 个物品,当其不放入背包时,背包的剩余容量和总价值都不变,故这种情况的最大价值为 ;当其放入背包时,背包的剩余容量会减小 ,背包中物品的总价值会增大 ,故这种情况的最大价值为 。
综上,转移是 。
由于对物品 影响的只有物品 ,所以我们可以去掉一维,用 表示容量为 的背包的最大价值,转移是 。
最后我们注意枚举顺序,是从大到小的,否则则会出现一个物品多次放入背包的情况。
code
CPP#include<bits/stdc++.h>
using namespace std;
int n, m, f[30001], v[30], p[30];
int main(){
cin >> n >> m;
for(int i=1; i<=m; i++)
cin >> v[i] >> p[i],
p[i]*=v[i];
for(int i=1; i<=m; i++)
for(int j=n; j>=v[i]; j--)
f[j]=max(f[j], f[j-v[i]]+p[i]);
cout << f[n];
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...