首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

程序 栈有关问题

2012-04-28 
程序 栈问题问题描述:假设有一个能装入总体积为T的背包和n件体积分别为w1 , w2 , … , wn 的物品,能否从n件

程序 栈问题
问题描述:
假设有一个能装入总体积为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));}



[解决办法]
struct那里是栈的定义。do while循环那里是用栈回溯找所有合适的解。你可以先看看数据结构中的栈的用法。就能理解了。
[解决办法]

探讨

栈 这个数据结构的性质 你还是知道吧,先进先出。
队伍 是 先进后出。

struct stacks
{
int data[size];
int top;
}stack

这个结构体就是用来表示栈的,data存储放进去的元素,top用来指向最上面的那个元素。

下面的操作 就是进栈出栈的过程。

热点排行