程序 栈问题
问题描述:
假设有一个能装入总体积为T的背包和n件体积分别为w1 , w2 , … , wn 的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1 +w2 + … + wn=T,要求找出所有满足上述条件的解。例如:当T=10,各件物品的体积{1,8,4,3,5,2}时,可找到下列4组解:
(1,4,3,2)
(1,4,5)
(8,2)
(3,5,2)。
下面是程序,我还没学过栈。所以有些地方看不懂想请教一下。红色字体都是看不懂得地方,希望哪位可以帮我解释一下。
谢谢。
程序:
#include <stdio.h>
#define size 20
struct stacks
{
int data[size];
int top;
}stack;void main()
{
int w[size];
int V;
int k=0;
int i=0;
int j=1;
int number;
int s=0;
printf("\n请输入可供选择装入物品的个数:");
scanf("%d",&number);
printf("\n请输入各件物品的体积:");
for(i=0;i<number;i++)
scanf("%d",&w[i]);
for(i=0;i<number;i++)
s=s+w[i];
printf("\n可供选择的物品的总体s=%d\n",s);
printf("\n请输入背包的总体积:");
scanf("%d",&V);
if(V<0||V>s)
printf("\n输入背包体积错误");
printf("\n");
for(i=0;i<number;i++)
stack.data[i]=0;
stack.top=0;
do
{
while(V>0&&k<=number)
{
if(V>=w[k])
{
stack.data[stack.top]=k;
stack.top++;
V-=w[k];
}
k++;
}
if(V==0)
{
printf("第%d个符合条件的解:",j);
for(i=0;i<stack.top;i++)
{
printf("%d ",w[stack.data[i]]);
}
j++;
printf("\n");
}
k=stack.data[--stack.top];
stack.data[stack.top]=0;
V+=w[k];
k++;
}while(!(stack.top==0&&k==number));}