HihoCoder - 1846 dfs

A - ABC

 HihoCoder - 1846 

雜貨鋪老闆一共有N件物品,每件物品具有ABC三種屬性中的一種或多種。從雜貨鋪老闆處購得一件物品需要支付相應的代價。  

現在你需要計算出如何購買物品,可以使得ABC三種屬性都在購買的物品中出現,並且支付的總代價最小。

Input

第一行包含一個整數N。  

以下N行,每行包含一個整數C和一個只包含"ABC"的字符串,代表購得該物品的代價和其具有的屬性。  

對於50%的數據,1 ≤ N ≤ 20  

對於100%的數據,1 ≤ N ≤ 1000 1 ≤ C ≤ 100000

Output

一個整數,代表最小的代價。如果無論如何湊不齊ABC三種屬性,輸出-1。

Sample Input

5
10 A
9 BC
11 CA
4 A
5 B

Sample Output

13
#include<iostream>
#include<stdio.h>
#include<cstring>
#define MAXN 1005
using namespace std;

struct node
{
    int cost;
    int s;
} good[MAXN];

int ans,num,str,cnt;


void dfs(int x)
{

    if(str==7)
    {
        ans=(ans==-1?cnt:min(ans,cnt));
        return;
    }
    if(x==num) return;
    for(int i=x; i<num; i++)
    {
        if(str|good[i].s>str)
        {
            int temp=str;
            if(ans==-1?0:(cnt+good[i].cost>=ans)) continue;
            cnt+=good[i].cost;
            str=str|good[i].s;
            dfs(i+1);
            cnt-=good[i].cost;
            str=temp;
        }
    }

}

char c[3]= {'A','B','C'};

void ini()
{
    str=0;
    cnt=0;
    ans=-1;
}

int main()
{
    cin>>num;
    for(int i=0; i<num; i++)
    {
        cin>>good[i].cost;
        string s;
        cin>>s;
        good[i].s=0;
        for(int j=0; j<3; j++)
        {
            if(s.find(c[j])!=string::npos)
            {
                good[i].s+=1<<j;
            }
        }
        //cout<<good[i].s<<endl;
    }

    ini();
    dfs(0);
    cout<<ans<<endl;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章