4 4 1 1 1 2 1 3 1 4 2 4 3 1 2 3 4 1 2 3 4
15 2
题意:
给你n个集合。集合中均为数字且数字的范围在[1,m]内。m<=14。现在问用这些集合能组成多少个集合自己本身也算。
思路:
开始有点无头绪。一看到m范围就乐了。正好用二进制压缩。第i为1表示集合里有i这个数。然后背包就行了。
详细见代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=100010;
//typedef __int64 ll;
int dp[1<<15],s[110],base[15];
int main()
{
int n,m,i,j,k,tp,ans;
base[0]=1;
for(i=1;i<=15;i++)
base[i]=base[i-1]<<1;
while(~scanf("%d%d",&n,&m))
{
memset(dp,0,sizeof dp);
dp[0]=1,ans=0;
for(i=0;i<n;i++)
{
s[i]=0;
scanf("%d",&k);
for(j=0;j<k;j++)
{
scanf("%d",&tp);
s[i]=s[i]|base[tp-1];
}
}
for(i=0;i<n;i++)
for(j=base[m]-1;j>=0;j--)
if(dp[j])
dp[j|s[i]]=1;
for(i=base[m]-1;i>=1;i--)
if(dp[i])
ans++;
printf("%d\n",ans);
}
return 0;
}
hdu 3006 The Number of set(思维+壮压DP),布布扣,bubuko.com
hdu 3006 The Number of set(思维+壮压DP)
原文地址:http://blog.csdn.net/bossup/article/details/25235483