void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

最大杀伤力

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

View Code
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 }
posted on 2011-05-07 16:07  void-man  阅读(253)  评论(0)    收藏  举报