URAL 1326(状态压缩DP)

题目链接:URAL 1326

解题思路:
状态压缩DP,也就是集合的DP,思路跟TSP问题很相似。需要注意的就是可以买多T^T

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f

using namespace std;

const int MAXN = 1<<20;
int n,m,dp[MAXN+5],a[120+5],w[120+5];

int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);  
            w[i] = 1<<(i-1);
        }

        scanf("%d",&m);
        int t,tmp,index=0,ans=INF;
        for(int i=1;i<=m;i++)
        {
            scanf("%d %d",&a[i+n],&t);
            while(t--)
            {
                scanf("%d",&tmp);
                w[i+n] |= 1<<(tmp-1);
            }
        }
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&tmp);
            index |= 1<<(tmp-1);
        }

        memset(dp,INF,sizeof(dp));
        dp[0]=0;
        for(int i=1;i<=n+m;i++)
        {
            for(int j=0;j<(1<<n);j++)
            {
                if(j&w[i])
                    dp[j] = min(dp[j], dp[j-(j&w[i])] + a[i]);
            }
        }

        for(int i=0;i<(1<<n);i++)
            if((index&i)==index)
                ans=min(ans,dp[i]);
        printf("%d\n",ans);
    }

    return 0;
}

总结:
思路其实相当明显,只是一开始看的时候不相信这么高的复杂度能过~

你可能感兴趣的:(URAL 1326(状态压缩DP))