题目描述:(简化)给出n种果汁,每种果汁可能包含A,B,C三种维生素,
每种果汁都有加个,问想要包含三种种维生素的最小花费。
题目链接:http://codeforces.com/contest/1042/problem/B
思路:因为只要包含三种维生素即可,所以可以暴力,具体见代码。
c++代码:
#include <iostream>
#include <vector>
#include <set>
#include <cstring>
using namespace std;
const int INF=1e9;
int v[9];
int main() {
int n;
cin >> n;
for(int i=1;i<8;i++)v[i]=INF;
for(int i=0;i<n;i++) {
int t;
string s;
cin >> t >> s;
int cnt=0;//将维生素配置转化为二进制表示
for(int j=0;j<s.length();j++) {
if(s[j]=='A')cnt=cnt|(1<<0);
else if(s[j]=='B')cnt=cnt|(1<<1);
else if(s[j]=='C')cnt=cnt|(1<<2);
}
//cout << cnt << endl;
v[cnt]=min(v[cnt],t);
//cout <<"v "<<v[cnt] << endl;
}
int ans=INF;
bool flag=0;
for(int i=1;i<8;i++) {
if(v[i]<INF) {
int tmp=v[i];
if(i==7){
ans=min(ans,tmp);
flag=1;
continue;
}
for(int j=1;j<8;j++) {
if(v[j]>=INF)continue;
int x=i;
x|=j;
tmp+=v[j];
if(x==7) {
ans=min(ans,tmp);
tmp-=v[j];
flag=1;
continue;
}
for(int k=1;k<8;k++) {
if(v[k]>=INF)continue;
int y=x;
y|=k;
tmp+=v[k];
if(y==7) {
ans=min(ans,tmp);
tmp-=v[k];
flag=1;
continue;
}
tmp-=v[k];
}
tmp-=v[j];
}
}
}
if(flag)
cout << ans << endl;
else cout << -1 << endl;
return 0;
}