https://www.cnblogs.com/violet-acmer/p/9682082.html
题意:
如果可以通过喝果汁将维生素A,B,C全部摄取,求最小花费,如果不能,输出"-1"。
题解:
我的思路:每个果汁含有的维生素最多有7种可能,分别为
A B C
AB(BA) AC(CA) BC(CB)
ABC(ACB)(BAC)(BCA)(CAB)(CBA)
将其分别对应为数字1-7
设变量price[i]
price[1] : 只含维生素A的饮料的最小价钱
price[2] : 只含维生素B的饮料的最小价钱
price[3] : 只含维生素C的饮料的最小价钱
...........
price[7] : 只含维生素ABC的饮料的最小价钱,注意含有维生素ACB和其余四种情况都记录在只含维生素ABC里
易知price[ ]记录的是含某维生素的最小花费的饮料的假期那
当n个果汁的信息输入完后,price[ ]数组也初始化完毕。
接着将含有复合(例如含有维生素AB)维生素的price[ ] 与单个维生素的总价格比较,如果复合的更便宜,则不更新,如果单个的总价格更便宜,则更新复合的价格
例如price["AB"]=10,price["A"]=2,price["B"]=6;
显然有price["AB"] > price["A"]+price["B"];
所以更新price["AB"]=price["A"]+price["B"];
最后输出price["ABC"]。
注意不存在三种维生素的情况要输出"-1"。
AC代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<map> 6 using namespace std; 7 #define INF 0x3f3f3f3f 8 const int maxn=1010; 9 10 int n; 11 int price[8]; 12 bool vis[4]; 13 14 map<string,int>mymap; 15 16 void Copy(string &s,char ss[]) 17 { 18 int len=strlen(ss); 19 for(int i=0;i < len;++i) 20 s += ss[i]; 21 s += '\0'; 22 } 23 void Initial() 24 { 25 mymap.clear(); 26 memset(vis,false,sizeof vis); 27 memset(price,INF,sizeof price); 28 mymap["A"]=1; 29 mymap["B"]=2; 30 mymap["C"]=3; 31 mymap["AB"]=mymap["BA"]=4; 32 mymap["AC"]=mymap["CA"]=5; 33 mymap["BC"]=mymap["CB"]=6; 34 mymap["ABC"]=mymap["ACB"]=mymap["BAC"]=mymap["BCA"]=mymap["CAB"]=mymap["CBA"]=7; 35 } 36 void Read() 37 { 38 scanf("%d",&n); 39 for(int i=1;i <= n;++i) 40 { 41 int c; 42 string s; 43 scanf("%d",&c); 44 cin>>s; 45 if(price[mymap[s]] > c) 46 price[mymap[s]]=c; 47 } 48 } 49 void Process() 50 { 51 price[4]=min(price[4],price[1]+price[2]); 52 price[5]=min(price[5],price[1]+price[3]); 53 price[6]=min(price[6],price[2]+price[3]); 54 price[7]=min(price[7],min(min(price[4]+price[3],price[5]+price[2]),price[6]+price[1])); 55 price[7]=min(price[7],min(min(price[4]+price[5],price[4]+price[6]),price[5]+price[6])); 56 printf("%d\n",price[7] >= INF ? -1:price[7]);//通过将所有的price[ ] 值设置为INF来判断ABC是否都存在 57 } 58 int main() 59 { 60 Initial(); 61 Read(); 62 Process(); 63 }