问题描述:
有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
*/