URAL 1326(状态压缩DP)

来源:互联网 发布:js base64性能 编辑:程序博客网 时间:2024/06/14 04:29

题目链接:URAL 1326

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

代码:

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define INF 0x3f3f3f3fusing 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;}

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

0 0
原创粉丝点击