CF1042B 【Vitamins】(去重,状压搜索)

由题意,我们其实会发现

对于每一种果汁,其对应的状态只有可能有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",&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 ",&ltt);
        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;
    }
}

猜你喜欢

转载自www.cnblogs.com/ztz11/p/9669955.html
今日推荐