完善程序 提高篇 6、【NOIP2002】构造物质

问题描述:

有n种基本物质(n≤10),分别记为P1,P2,……,Pn,用n种基本物质构造物质,
这些物品使用在k个不同地区(k≤20),
每个地区对物品提出自己的要求,这些要求用一个n位的数表示:a1a2……a n,
其中:
    ai = 1表示所需物质中必须有第i种基本物质
       = -1表示所需物质中必须不能有第i种基本物质
       = 0无所谓

问题求解:

当k个不同要求给出之后,给出一种方案,指出哪些物质被使用,哪些物质不被使用。

程序说明:

数组  b[1],b[2]……b[n]    表示某种物质
      a[1..k,1..n]        记录k个地区对物品的要求,其中:
      a[i,j]=1            表示第i个地区对第j种物品是需要的
      a[i,j]=0            表示第i个地区对第j种物品是无所谓的
      a[i,j]= -1          表示第i个地区对第j种物品是不需要的

程序:


/*
6、【NOIP2002】构造物质 
二.
问题描述:
有n种基本物质(n≤10),分别记为P1,P2,……,Pn,用n种基本物质构造物质,
这些物品使用在k个不同地区(k≤20),
每个地区对物品提出自己的要求,这些要求用一个n位的数表示:a1a2……a n,
其中:
    ai = 1表示所需物质中必须有第i种基本物质
       = -1表示所需物质中必须不能有第i种基本物质
       = 0无所谓

问题求解:

当k个不同要求给出之后,给出一种方案,指出哪些物质被使用,哪些物质不被使用。

程序说明:

数组  b[1],b[2]……b[n]    表示某种物质
      a[1..k,1..n]        记录k个地区对物品的要求,其中:
      a[i,j]=1            表示第i个地区对第j种物品是需要的
      a[i,j]=0            表示第i个地区对第j种物品是无所谓的
      a[i,j]= -1          表示第i个地区对第j种物品是不需要的
程序:
*/
#include <iostream>
#include <cstdio>
using namespace std;
int a[21][11],b[21],i,j,k,n;
bool p;
int main( )
{
	scanf("%d %d",&n,&k);
	for(i=1;i<=k;++i) for( j=1;j<=n;++j) scanf("%d\n",a[i][j]);
	for(i=0;i<=n;++i) b[i]=0;
	p=true;
	while(  ____(1)___ )
	{
		j=n;
		while( b[j]==1) j=j-1;
		___(2)___
		for(i=j+1;i<=n;++i) b[i]=0;
		___(3)____
		for(i=1;i<=k;++i)
			for(j=1;j<=n;++j)
				if( a[i][j]==1 && b[j]==0 || ___(4)___ ) p=true;			
	} 
	if( __(5)___ ) printf("找不到!\n");
	else	for( i=1;i<=n;++i)
				if( b[i]==1 ) printf("物质%d需要\n",&i);
				else  printf("物质%d不需要\n",&i);	
	return 0;
}
/*
答案:
(1)、p && b[0]==0
(2)、b[j]=1;
(3)、p=false;
(4)、a[i][j]==-1 && b[j]==1
(5)、p或b[0]==1 
*/ 



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dllglvzhenfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值