由题意,我们其实会发现
对于每一种果汁,其对应的状态只有可能有7种
VA
VB
VC
VA+VB
VA+VC
VB+VC
VA+VB+VC
这道题就大大简化了
我们把所有果汁都读进来
每种状态取价格最小的(这才有可能最优)
(在这里我状压了一下,用二进制表示其种类)
之后爆搜即可
如果当前已满足(三种维生素都有了,答案就取min)
最后输出即可
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define rii register int i #define rij register int j using namespace std; int bj[1005],zt[150],n; long long ans=2147483647; void dfs(int wz,long long an,int ztz) { if(ztz==7) { ans=min(ans,an); return; } for(rii=wz+1;i<=7;i++) { if(zt[i]!=2147483647) { dfs(i,an+zt[i],ztz|i); } } } int main() { scanf("%d ",&n); for(rii=1;i<=149;i++) { zt[i]=2147483647; } for(rii=1;i<=n;i++) { bj[1]=0; bj[2]=0; bj[3]=0; int ltt; int ztz=0; scanf("%d ",<t); char l=getchar(); while(l!=10) { if(l=='A'&&bj[1]==0) { ztz|=1; bj[1]=1; } if(l=='B'&&bj[2]==0) { ztz|=2; bj[2]=1; } if(l=='C'&&bj[3]==0) { ztz|=4; bj[3]=1; } l=getchar(); } zt[ztz]=min(zt[ztz],ltt); } dfs(0,0,0); if(ans>=2147483647) { cout<<"-1"; } else { cout<<ans; } }