您的位置:首页 > 其它

URAL 1326(状态压缩DP)

2016-02-03 23:41 399 查看
题目链接: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;
}


总结:

思路其实相当明显,只是一开始看的时候不相信这么高的复杂度能过~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: