配方(c++题解)

题目描述

某种食品由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,m,ans=1;
int a[10005][10005],b[10005];//b标记一下每一份原料顾客的需要状态
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
		    cin>>a[i][j];
		    if(a[i][j]+b[j]==3){//一个是1一个是2加起来是3就代表矛盾输出
		    	cout<<"-1";
		    	return 0;
			}
			if(b[j]==0)b[j]=a[i][j];//注意这里需要判断一下才能改状态,不然原本是1或2结果改成0
	    }
	}
	for(int i=1;i<=m;i++){//小学奥数求总方案数
		if(b[i]==0)ans*=2;
	}
	cout<<ans;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值