09年 ZZUPC校赛第四题 多重背包 最大杀伤力

本博客介绍了一种帮助玩家Bean在限定MP值和技能使用次数的情况下,最大化对敌手造成杀伤力的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



最大杀伤力

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值