最大杀伤力
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
样例解释
使用第1 个技能1次
使用第3 个技能3次
一共耗掉MP值9点,对敌手能造成最大杀伤力值= 10+11+11+11
典型的多重背包,简单办法就是把多重的转换成0-1背包,把背包个数拆分成1,2,4,8....个,然后用0-1一次背包直接ac

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <iostream>
4 #include <string.h>
5 #include <math.h>
6 using namespace std;
7 int main(void)
8 {
9 int n,m,count;
10 int mp[1010],hurt[1010],num[1010];
11 int hp[1010],mmp[1010],h[1010];
12 while( cin >> n >> m )
13 {
14 count = 1;
15 memset(hp,0,sizeof(hp));
16 for(int i=1; i<=n; i++)
17 cin >> mp[i] >> hurt[i] >> num[i];
18 for(int i=1; i<=n; i++)
19 {
20 int sum = 0;
21 for(int k=0; ; k++)
22 {
23 int x = (int)pow(2,k);
24 if( sum + x > num[i] )
25 break;
26 sum += x;
27 h[count] = x*hurt[i];
28 mmp[count] = x*mp[i];
29 count++;
30 }
31 int x = num[i] - sum;
32 if( x == 0 )
33 continue;
34 h[count] = x*hurt[i];
35 mmp[count] = x*mp[i];
36 count++;
37 }
38 for(int i=1; i<count; i++)
39 for(int k=m; k>=mmp[i]; k--)
40 if( hp[k] < hp[k-mmp[i]] + h[i] )
41 hp[k] = hp[k-mmp[i]] + h[i];
42 cout << hp[m] << endl;
43 }
44 return 0;
45 }