最大杀伤力
TimeLimit: 1000MS MemoryLimit: 32768 Kb
Totalsubmit: 9 Accepted: 5
Description
Bean最近一直在沉迷DNF,但因为等级比较低,所以在PK场里总会被人“虐”,于是,Bean就想进行“地狱式”的训练。Bean现在的MP值还有K点,并且具有N个技能,对于每个技能的使用,都会消耗掉MP值,当然同时也会对敌手造成一定的杀伤力。. 在目前的状况下,Bean想让你帮他规划一下,如何使用这些技能,最后对敌手造成杀伤力最大。当然,对每个技能的施放次数会有所限制的,下面就由你来帮Bean完成这个任务吧。
Input
第一行: N K
表示有N个技能和MP值还有K点;
接下来有N行,每行有3个数据:
Ai Bi Ci
Ai表示使用第i个技能一次耗掉的MP值;
Bi表示使用第i个技能一次对敌手造成杀伤力的值;
Ci表示第i个技能最多使用次数。
Output
对每组数据,输出仅有一行,即一个整数,表示能达到的最大杀伤力。
Sample Input
3 10
3 10 1
5 20 1
2 11 3
Sample Output
43
Hint
1≤ N≤15 1≤ K≤999
1≤ Ai ≤ K 1≤ Bi ≤999 1≤Ci≤10
多重背包
#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int N,K,x,y,z,mp[1010],sl[1010],dp[1010];
while(scanf("%d%d",&N,&K)!=EOF){
int count=0;
for(int i=0;i<N;i++){
scanf("%d%d%d",&x,&y,&z);
for(int i=1;i<=z;i<<=1){
sl[count]=i*y;
mp[count++]=i*x;
z-=i;
}
if(z>0){
sl[count]=z*y;
mp[count++]=z*x;
}
}
memset(dp,0,sizeof(dp));
for(int i=0;i<count;i++)
for(int j=K;j>=mp[i];j--){
dp[j]=max(dp[j],dp[j-mp[i]]+sl[i]);
}
cout<<dp[K]<<endl;
}
return 0;
}