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, 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;
} 
  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值