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;
}

總結:
思路其實相當明顯,只是一開始看的時候不相信這麼高的複雜度能過~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章