二进制枚举:islands打炉石传说

二进制枚举:islands打炉石传说

问题描述 islands 最近在完一款游戏“炉石传说”,又名“魔兽英雄传”。炉石传说是一款卡牌类对战的游戏。游戏是两人对战,总的来说,里面的卡牌分成两类,一类是法术牌,另一类是随从牌(所谓随从就是怪物)。 为了简化问题,现在假设随从牌的作用是召唤一个具有一定攻击力的怪物,法术牌的作用是给某个随从增加一定攻击力。随从牌和法术牌的使用都需要消耗一定的法力值。现在 islands 有10 点法力值,手上有n 张牌(islands 最多有10 张牌,否者他将会被爆牌 T_T),有些是法术牌,有些是随从牌。islands 现在是大劣势,他想要是利用这10 点法力值使得召唤出来的所有随从的攻击力总和最高(法力值可以不用完)。注意,任何法术牌都必须使用在某个召唤出来的随从上,也就是如果 islands 没有召唤过随从,他将不能使用任何法术牌。告诉 islands 他能召唤的随从的总攻击力最大是多少。

输入格式 每组数据首先输入一个n(0≤n≤10,表示 islands 有n 张牌。 接下来n 行,每行输入3 个整数 cost(0≤cost≤10),d(0 或者1),w(∣w∣≤1000)。其中cost 表示该牌的法力值消耗,如果d=0,表示该牌是攻击力为w 的随从牌;如果d=1,表示是能给一个随从增加w 攻击的法术牌。

输出格式 输出一行表示答案。

样例输入

1

1 0 100

样例输出

100

思路:用二进制枚举的方式枚举使用的卡牌,然后判断是否合法,然后取最大的攻击力。 代码如下:

#include<iostream>

using namespace std;

struct a

{

int cost,d,w;

}aa[10];

int main()

{

int n;

cin>>n;

for(int i=0;i<n;i++)

cin>>aa[i].cost>>aa[i].d>>aa[i].w;

int max=0;

for(int i=0;i<(1<<n);i++)//枚举所有可能的子集

{

int flag=0;//用于判断是否存在随从牌

int falisum=0;//攻击力总和

int costsum=0;//消耗法力的总和

for(int j=0;j<n;j++)//遍历某种情况下在子集中的元素

{

if(i&(1<<j))

{

if(aa[j].d==0)

flag=1;

costsum+=aa[j].cost;

falisum+=aa[j].w;

}

}

if(flag==1&&falisum>max&&costsum<=10)//判断该子集中的元素是否合法且攻击力是当前遍历到的子集中的最大值

max=falisum;

}

cout<<max<<endl;

return 0;

}

经验分享 程序员 微信小程序 职场和发展