标签:style max mod case turn family class mem ane
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)
标签:style max mod case turn family class mem ane
原文地址:http://www.cnblogs.com/claireyuancy/p/6855645.html