程序 栈问题

ytyytryrtyryr 2012-04-09 09:15:34
问题描述:
假设有一个能装入总体积为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));
}

...全文
90 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
quwei197874 2012-04-09
  • 打赏
  • 举报
回复
goog乚e一下呗
muyi66 2012-04-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

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

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

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

下面的操作 就是进栈出栈的过程。
[/Quote]栈是后进先出哦,队列才是先进先出。
hen_hao_ji 2012-04-09
  • 打赏
  • 举报
回复
栈 这个数据结构的性质 你还是知道吧,先进先出。
队伍 是 先进后出。

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

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

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

cattycat 2012-04-09
  • 打赏
  • 举报
回复
struct那里是栈的定义。do while循环那里是用栈回溯找所有合适的解。你可以先看看数据结构中的栈的用法。就能理解了。
猪头小哥 2012-04-09
  • 打赏
  • 举报
回复
其他地方就是算法了 看不懂也没关系 只要知道用就行了~
/* 结构体的定义 */
struct stacks
{
int data[size];
int top;
}stack

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧