二进制枚举: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)d0 或者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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值