您的位置:首页 > 运维架构

bzoj1688: [Usaco2005 Open]Disease Manangement 疾病管理(状压dp)

2015-10-05 15:29 501 查看
状压dp一直是弱项啊。。。

#include<stdio.h>
#include<algorithm>
using namespace std;
int n,m,k;
int val[2000];
int f[1000000];
bool check(int x)
{
int cnt=0;
while(x)
{
cnt+=(x&1);
x=x>>1;
}
if(cnt>k)return false;
return true;
}
int main()
{
scanf("%d %d %d",&n,&m,&k);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
while(x--)
{
int a;
scanf("%d",&a);
val[i]|=(1<<(a-1));
}
}
for(int i=1;i<=n;i++)
{
for(int j=(1<<m)-1;j>=0;j--)//一定要倒序,正序会有一个取好几遍的情况
{
f[j|val[i]]=max(f[j|val[i]],f[j]+1);
}
}
int ans=0;
for(int i=0;i<(1<<m);i++)
{
if(check(i))ans=max(ans,f[i]);
}
printf("%d\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息