问题 填空题

[说明]
“背包问题”的基本描述是:有一个背包,能盛放的物品总重量为S,设有N件物品,其重量分别为w1、w2、…、wn,希望从N件物品中选出若干件物品,并使所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。
[函数]
#include <stdio.h>
#define N 7
#define S 15
typedef struct
int s;
int n;
int job;
KNAPTP;
int knap (int S,int n) ;
main ()
if (knap (S,N)) printf ("OK! \n");
else printf ("NO! \n") ;

int knap (int S,int n)
KNAPTP stack[100] ,x;
int top,k, rep;
x.S=S; x.n=n;
x.job=0;
top=1; stack[top] =x;
k=0;
while (1)
x=stack [top] ;
rep=1;
while (! k&&rep)
if(x.s=0) k=1;
else if x.s<0 ||x.n<=0) rep=0;
else
x.s= (2) ;
x. job=1;
(3) =x;


if(!k)
rep=1;
while(top>=1&&rep)
x=stack [top--1];
if (x,job=1)
x.s+=w[x.n+1];
(4) ;
stack [++top] =x;
(5) ;



if(k)
while (top>=1)
x=stack [top--] ;
if (x.job==1)
printf ("M\t",w[x.n+1]) ;



return k;

答案

参考答案:rep=0

解析: k记录是否找到一组解的标记。若栈不空且还未找到解,则开始进入循环。所以空(1)填top>=1 && !k或top>0 && k==0。当没有发现解,同时背包还有容量且物品还有,则将修改剩下的容量x.s=x.s-w[x.n--],并压栈后,继续循环。因此空(2)和空(3)的答案分别为x.s-w[x.n--]和stack[++top]。其中,当没有找到解时,退栈且应该把占用的容量返回,并记录该物品不是解中的物品,即空(4)填x.job=2,空(5)填rep=0。

单项选择题
单项选择题