宝石手镯[01背包]

题目描述

贝茜在珠宝店闲逛时,买到了一个中意的手镯。很自然地,她想从她收集的 N ( 1 ≤ N ≤ 3 , 402 ) N(1 \le N \le 3,402) N(1N3,402)块宝石中选出最好的那些镶在手镯上。对于第 i i i块宝石,它的重量为 W i ( 1 ≤ W i ≤ 400 ) W_i(1 \le W_i \le 400) Wi(1Wi400),并且贝茜知道它在镶上手镯后能为自己增加的魅力值 D i ( 1 ≤ D i ≤ 100 ) D_i(1 \le D_i \le 100) Di(1Di100)。由于贝茜只能忍受重量不超过 M ( 1 ≤ M ≤ 12 , 880 ) M(1 \le M \le 12,880) M(1M12,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+36,同样符合要求。

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;
}
posted @ 2020-06-23 21:07  XSC062  阅读(75)  评论(0编辑  收藏  举报