zjut1675 I like DPS!!!
http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1675
/*
Description:
Altynai是一个纯正的DOTA菜鸟..而且他玩DOTA有一个特点,就是特别喜欢那些DPS(每秒输出的伤害)高的英雄..
而且买的装备也是专门买那种加攻击力加的很多的装备.. = =
现在他又在玩DOTA了..由于一开始杀了很多次敌方的英雄和小兵,Altynai现在身上有一些小钱了..
现在他开心的回自己的基地准备买装备了..由于有限制,他身上最多能带6个装备,而且每种装备他最多买一件..
由于时间紧迫,他必须抓紧时间来买装备,从而能使自己的攻击力增加的最多..当然了,Altynai不在意花了多少钱..
毕竟他最在意的是能增加的攻击力!
请你帮帮Altynai,算一下他能增加的最大的攻击力.
Input:
有多组数据,每组数据第一行为2个整数N和T(1<=N<=15,0<=T<=100000),表示基地装备的种类和Altynai现在身上有的钱。 接下去N行,每行有1个字符串s(1<=s长度<=20,只含有小写字母)和2个整数d和m(0<=d<=250,100<=m<=6000),分别表示每种武器的名字,增加的攻击力和价格。
Output:
算一下他能增加的最大的攻击力.
Sample Input:
6 100000
shengjian 250 6200
duijian 100 4450
yangdao 150 6666
budaofu 200 3000
hudie 180 4100
anmie 200 3500
Sample Output:
1080
*/
#include<iostream>
#include<string>
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
/*Brute force*/
struct node
{
int cost,dps;
}a[16];
bool cmp(const node &a,const node&b)
{
if(a.dps!=b.dps)return a.dps>b.dps;
return a.cost<b.cost;
}
int main()
{
int n,fee,ans;
string s;
while(cin>>n>>fee)
{
ans=0;
for(int i=0;i<n;i++)
cin>>s>>a[i].dps>>a[i].cost;
sort(a,a+n,cmp);
for(int i1=0;i1<n;i1++)
{
int rmb1=fee,p1=0;
if(a[i1].cost>rmb1)continue;
if(a[i1].cost==rmb1)
{
p1+=a[i1].dps;
if(p1>ans)ans=p1;
continue;
}
rmb1-=a[i1].cost;
p1+=a[i1].dps;
if(p1>ans)ans=p1;
for(int i2=i1+1;i2<n;i2++)
{
int rmb2=rmb1,p2=p1;
if(a[i2].cost>rmb2)continue;
if(a[i2].cost==rmb2)
{
p2+=a[i2].dps;
if(p2>ans)ans=p2;
continue;
}
rmb2-=a[i2].cost;
p2+=a[i2].dps;
if(p2>ans)ans=p2;
for(int i3=i2+1;i3<n;i3++)
{
int rmb3=rmb2,p3=p2;
if(a[i3].cost>rmb3)continue;
if(a[i3].cost==rmb3)
{
p3+=a[i3].dps;
if(p3>ans)ans=p3;
continue;
}
rmb3-=a[i3].cost;
p3+=a[i3].dps;
if(p3>ans)ans=p3;
for(int i4=i3+1;i4<n;i4++)
{
int rmb4=rmb3,p4=p3;
if(a[i4].cost>rmb4)continue;
if(a[i4].cost==rmb4)
{
p4+=a[i4].dps;
if(p4>ans)ans=p4;
continue;
}
rmb4-=a[i4].cost;
p4+=a[i4].dps;
if(p4>ans)ans=p4;
for(int i5=i4+1;i5<n;i5++)
{
int rmb5=rmb4,p5=p4;
if(a[i5].cost>rmb5)continue;
if(a[i5].cost==rmb5)
{
p5+=a[i5].dps;
if(p5>ans)ans=p5;
continue;
}
rmb5-=a[i5].cost;
p5+=a[i5].dps;
if(p5>ans)ans=p5;
for(int i6=i5+1;i6<n;i6++)
{
int rmb6=rmb5,p6=p5;
if(a[i6].cost>rmb6)continue;
if(a[i6].cost==rmb6)
{
p6+=a[i6].dps;
if(p6>ans)ans=p6;
continue;
}
rmb6-=a[i6].cost;
p6+=a[i6].dps;
if(p6>ans)ans=p6;
}
}
}
}
}
}
cout<<ans<<endl;
}
}
#include<iostream>
#include<string>
using namespace std;
int n,fee,ans;
int dps[15],cost[15];
string s;
void DFS(int num,int mon,int att,int x)//num武器数 mon已用钱数 att现有攻击力 x上一件武器编号
{
if(num>6)return;
if(mon>fee)return;
if(att>ans){ans=att;}
for(int i=x+1;i<n;i++)
DFS(num+1,mon+cost[i],att+dps[i],i);
}
int main()
{
while(cin>>n>>fee)
{
ans=0;
for(int i=0;i<n;i++)
{
cin>>s>>dps[i]>>cost[i];
}
DFS(0,0,0,-1);
cout<<ans<<endl;
}
}
浙公网安备 33010602011771号