题目描述
某种食品由k种原料组成(1≤k≤16),每种原料的编号为1,2,3,…,k。同时有n个人(1≤n≤1000),每个人对食品中的原料有一定的要求。全部的要求是一个n×k的矩阵。
a[1,1] a[1,2] a[1,3] … a[1,k]
a[2,1] a[2,2] a[2,3] … a[2,k]
…
a[n,1] a[n,2] a[n,3] … a[n,k]
a[i,j] =1,表示第i个人对第j种原料要求一定要有。
a[i,j] =2,表示第i个人对第j种原料要求一定不能有。
a[i,j] =0,表示第i个人对第j种原料要求可有可无。
那么,当n,k和要求矩阵给出之后,求出所有符合要求的食品方案数。若不可能,则输出-1。
输入
第一行2个整数n和k,接下来n行,每行k个数据,每个数据分别为0,1或2,表示要求矩阵。
输出
一个整数,表示所有符合要求的食品方案数,如不可能,输出-1。
样例
输入:
2 3
1 0 1
0 0 1
输出:
2
提示
样例输入输出解释:
即食品的三种原料为有,有,有或有,无,有均可,故有2种方案。
参考代码
#include <bits/stdc++.h>
using namespace std;
int n, k;
int a[1005][20];
long long ans=1;
int main(){
cin >> n >> k;
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
cin >> a[i][j];
}
}
for(int i=1;i<=k;i++){//按照一列一列的枚举
bool flag1=false, flag2=false;
for(int j=1;j<=n;j++){
if(a[j][i]==1) {
flag1=true;
}
else if(a[j][i]==2){
flag2=true;
}
}
if(flag1==true&&flag2==true){//冲突
cout << -1;
return 0;
}
if(flag1==true||flag2==true){//必有或必无的情况
ans*=1;
}
else{//可有可无
ans*=2;
}
}
cout << ans;
return 0;
}