宝石手镯[01背包]
题目描述
贝茜在珠宝店闲逛时,买到了一个中意的手镯。很自然地,她想从她收集的 N ( 1 ≤ N ≤ 3 , 402 ) N(1 \le N \le 3,402) N(1≤N≤3,402)块宝石中选出最好的那些镶在手镯上。对于第 i i i块宝石,它的重量为 W i ( 1 ≤ W i ≤ 400 ) W_i(1 \le W_i \le 400) Wi(1≤Wi≤400),并且贝茜知道它在镶上手镯后能为自己增加的魅力值 D i ( 1 ≤ D i ≤ 100 ) D_i(1 \le D_i \le 100) Di(1≤Di≤100)。由于贝茜只能忍受重量不超过 M ( 1 ≤ M ≤ 12 , 880 ) M(1 \le M \le 12,880) M(1≤M≤12,880)的手镯,她可能无法把所有喜欢的宝石都镶上。 于是贝茜找到了你,告诉了你她所有宝石的属性以及她能忍受的重量,希望你能帮她计算一下,按照最合理的方案镶嵌宝石的话,她的魅力值最多能增加多少。
输入格式
- 第 1 1 1行: 2 2 2个用空格隔开的整数 N N N 和 M M M
- 第 2... N + 1 2...N+1 2...N+1行: 第 i + 1 i+1 i+1行为2个用空格隔开的整数: W i W_i Wi、 D i D_i Di,分别为第i块宝石 的重量与能为贝茜增加的魅力值
输出格式
- 第 1 1 1行: 输出 1 1 1个整数,表示按照镶嵌要求,贝茜最多能增加的魅力值
样例
样例输入
4 6
1 4
2 6
3 12
2 7
输入说明
贝茜收集了4块宝石,她能忍受重量最大为6的手镯。
样例输出
23
输出说明
贝茜把除了第二块宝石的其余所有宝石都镶上手镯,这样她能增加 4 + 12 + 7 = 23 4+12+7=23 4+12+7=23的魅力值,并且所有宝石的重量为 1 + 2 + 3 ≤ 6 1+2+3 \le 6 1+2+3≤6,同样符合要求。
code
异常明显的0/1背包
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using std::max;
int c[3410],w[3410],f[12885];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d%d",&w[i],&c[i]);
for(int i=1;i<=n;++i){
for(int j=m;j>=w[i];--j){
f[j]=max(f[j],f[j-w[i]]+c[i]);
}
}
printf("%d",f[m]);
return 0;
}
—— · EOF · ——
真的什么也不剩啦 😖