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;
}
posted @ 2018-03-31 11:28  全OI最菜  阅读(96)  评论(0编辑  收藏  举报