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 += '