题目链接: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;
}
总结:
思路其实相当明显,只是一开始看的时候不相信这么高的复杂度能过~