poj2441(状态压缩dp)

来源:互联网 发布:淘宝上的内衣有图评论 编辑:程序博客网 时间:2024/04/30 18:13

链接:点击打开链接

题意:有n头牛,每头牛有自己喜欢住的屋子,问使所有牛都住上自己喜欢的屋子有几种可能

代码:

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;int d[25][25],dp[(1<<20)+5];                    //因为开成二维会MLE,因此变成一维只记录状态int main(){                                     //状态压缩dp    int n,m,i,j,k,x,ans,num;    while(scanf("%d%d",&n,&m)!=EOF){        memset(d,0,sizeof(d));        memset(dp,0,sizeof(dp));        for(i=0;i<n;i++){            scanf("%d",&num);            for(j=0;j<num;j++){                scanf("%d",&x);                d[i][x-1]=1;            }        }        dp[0]=1;                                //0代表没使用,1代表使用        for(i=0;i<n;i++){            for(j=0;j<=(1<<m)-1;j++){                if(__builtin_popcount(j)==i)    //只有当前面状态所含1的个数为i使,才能继续往里添加                for(k=0;k<m;k++){               //否则其它状态是不存在的                    if(!(j&(1<<k))&&d[i][k]==1)                    dp[j|(1<<k)]+=dp[j];                }            }        }        ans=0;        for(i=0;i<(1<<m);i++)        if(__builtin_popcount(i)==n)            //用的内置函数,判断二进制中1的个数        ans+=dp[i];        printf("%d\n",ans);    }    return 0;}


 

0 0
原创粉丝点击