猛狮亨利
题目描述
自金天成在德意志各个公国树立威信后,他准备开始攻打波兰,后勤工作由萨克森和巴伐利亚两个公国负责。
而在金天成攻打波兰期间,德意志最强大的王公“饭桌猛狮亨利” ,别名“二胖” ,宣布
他才是德意志的国王!发动了叛乱。
为了食物,金天成国王表示“一定要胖揍 ”。
于是,他留了部分人在战斗前线,带领一队人马前往镇压叛乱。
这时,他发现,他能带走的粮食有限,而士兵都是有饭量的。
比如某位叫“巨胖”的军官可以使用碾压战术杀死一条线上的所有敌人(无视兵种) ,也可以当城墙使用,但是他一顿可以吃一吨。
又比如某位叫“中二现”的军官,他饭量不多,但是杀伤力没“巨胖”军官强。
这就让金天成犯难了。
因为金天成一顿也可以吃一吨……
所以,金天成希望能够在减去他的饭量后所剩下粮食数量有限的情况下, 带领的士兵杀伤力最大, 且不至于断粮而饿死沙场。
现在,他手下有
N
类可以带走的士兵或者军官,数量无限。
每类士兵或军官都有个饭量
现在请告诉金天成他能带走的杀伤力最强的部队杀伤力为多少。
输入格式
第
第
2
行到第
输出格式
输出一行,即最强部队杀伤力数值。
样例输入
4 10
2 3
3 5
4 6
5 7
样例输出
16
样例解释
带
饭量
数据范围
30%
的数据:
1≤N≤10
,
1≤M≤20
。
100%
的数据:
1≤N≤10000
,
1≤M≤10000
,
1≤Ai≤10000
,
1≤Bi≤10000
。
Solution
完全背包问题
Code
#include <iostream>
#include <cstdio>
#define Max(x,y) ((x)>(y)?(x):(y))
using namespace std;
int n,m;
int w[10010],c[10010];
int f[10010];
int main(){
freopen("lion.in","r",stdin);
freopen("lion.out","w",stdout);
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=w[i];j<=m;j++)
f[j]=Max(f[j],f[j-w[i]]+c[i]);
printf("%d\n",f[m]);
return 0;
}