配方(c++题解)

2024-01-09 21:39:42

题目描述

某种食品由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;
}

?

文章来源:https://blog.csdn.net/hb_zhyu/article/details/135430875
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。