题目名称 217. [USACO Open05] 疾病管理
输入输出 disease.in/out
难度等级 ★★
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 10
题目来源 Gravatarcqw 于2008-11-13加入
开放分组 全部用户
提交状态
分类标签
搜索法 状压DP
分享题解
通过:123, 提交:329, 通过率:37.39%
GravatarHeHe 100 0.007 s 0.82 MiB C++
GravatarFoolMike 100 0.008 s 0.79 MiB C++
GravatarL_in 100 0.015 s 0.32 MiB C++
Gravatar牧殇 100 0.016 s 0.55 MiB C++
Gravatarlingyixiaoyao 100 0.017 s 0.32 MiB C++
Gravatarliuliuliu 100 0.017 s 0.32 MiB C++
GravatarWildRage 100 0.017 s 0.32 MiB C++
Gravatarlingyixiaoyao 100 0.018 s 0.32 MiB C++
GravatarNarcissus 100 0.020 s 0.34 MiB C++
Gravatarchad 100 0.022 s 0.32 MiB C++
本题关联比赛
NOIP2008集训模拟5
关于 疾病管理 的近10条评论(全部评论)
k=22左右似乎只能集合并卷积卡常了
GravatarFoolMike
2017-06-21 08:00 13楼
正反dp是个玄学……
GravatarHZOI_蒟蒻一只
2017-05-17 17:15 12楼
k>=0 不是>=1
GravatarHerian
2017-02-25 14:32 11楼
回复楼上,确实可以
Gravatarxzz_233
2017-02-25 14:15 10楼
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<ctime>
#include<cmath>
#include<map>
#include<set>
#define MAXX 501
using namespace std;
int n,k,d,ans,f[MAXX][16*16*16*16+1],len[MAXX],p[MAXX][16];
void init(){
scanf("%d%d%d",&n,&d,&k);
for(int i=1;i<=n;++i){
scanf("%d",&len[i]);
for(int j=1;j<=len[i];++j)scanf("%d",&p[i][j]);
}
}
bool check(int j){
int num=0;
while(j){
num+=(j&1);
j>>=1;
}
if(num>k)return 0;
return 1;
}
void findanswer(){
for(int i=1;i<=n;++i){
for(int j=0;j<=(1<<d);++j){
if(!check(j))continue;
int jj=j;
for(int h=1;h<=len[i];++h)jj=jj|(1<<(p[i][h]-1));
if(check(jj))f[i][jj]=max(f[i-1][jj],f[i-1][j]+1);//挤或不挤
f[i][j]=max(f[i][j],f[i-1][j]);
ans=max(ans,max(f[i][j],f[i][jj]));
}
}
printf("%d",ans);
return;
}
int main(){
freopen("disease.in","r",stdin);
freopen("disease.out","w",stdout);
init();
findanswer();
return 0;
}
Gravatarhee
2017-02-25 13:49 9楼
回应楼上↑:这就是只状压,不dp的写法 =-=
GravatarPhosphorus15
2016-11-12 17:00 8楼
此题可以只有状压,没有dp。
Gravatarkito
2016-10-28 06:18 7楼
f[i]代表疾病状态为i的情况下最多有多少只羊
GravatarGo灬Fire
2016-10-09 20:56 6楼
GravatarMagic_Sheep
2016-06-18 19:53 5楼
(震惊的)状压
Gravatarsxysxy
2016-04-03 21:05 4楼

217. [USACO Open05] 疾病管理

★★   输入文件:disease.in   输出文件:disease.out   简单对比
时间限制:1 s   内存限制:128 MiB

【问题描述】

天啊,真是不幸!最近在农夫 John 的农场上有 D(1<=D<=15) 种疾病 ( 疾病的编号为 1..D) 在奶牛当中流行。 John 想要给他的 N(1<=N<=1000) 头奶牛挤牛奶。挤出来的牛奶都被放在一个罐子里面。如果这些牛奶中包含了超过 K(1<=K<=D) 种的疾病,那么这些牛奶就要全部被丢弃掉了(浪费啊 -_-! )。 John 应该给这 N 头奶牛当中的哪些奶牛挤奶,才能使得牛奶不被丢弃,并且挤牛奶的数量最多呢?

【输入格式】

第一行:三个整数 N,D 和 K

接下来有 N 行:这当中的第 i 行描述了第 i 个奶牛得病的信息。第一个数字 p ,表示第 i 头奶牛得了 p 种病,接下来有 p 个数字表示这些病的编号。如果 p 等于 0 ,表明这头奶牛很健康。

【输出格式】

输出 John 最多可以给多少头奶牛挤牛奶。

【输入样例】

6 3 2
0
1 1
1 2
1 3
2 2 1
2 2 1

【输出样例】

5

【输入输出样例说明】

John 最多可以给 5 头奶牛挤牛奶。他们的编号分别为 1,2,3,5,6. 此时这些牛奶中只包含 2 种疾病,编号为 1 , 2 。疾病种数不超过 K=2.