二進制枚舉: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章