SSL-ZYC 2408 比萨
题目大意:
思路:
DFS爆搜
数据小,可以轻松AC。
代码:
#include <cstdio>
#include <iostream>
using namespace std;
int sum,n,m,a[61][31],t[31],b[61],l,ok;
int p() //判断
{
ok=0;
for (int i=1;i<=m;i++) //枚举每个矛盾方案
{
for (int j=1;j<=b[i];j++) //枚举
if (t[a[i][j]]==0) //如果有一个没有选到
{
ok++; //就可以选
break; //退出
}
}
if (ok==m) return 0; //如果全部不矛盾就可以使用该料
return 1; //否则不行
}
void dfs(int k) //深搜
{
if (k>n) //已经搜完
{
sum++; //计数
return; //返回
}
t[k]=1; //桶,选择第k个料
if (p()==0) dfs(k+1);
t[k]=0;
dfs(k+1); //不选第k个料
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d",&b[i]);
for (int j=1;j<=b[i];j++)
scanf("%d",&a[i][j]);
}
dfs(1); //搜索
printf("%d\n",sum);
return 0;
}