永发信息网

用C语言实现背包问题求解。

答案:2  悬赏:80  手机版
解决时间 2021-05-13 17:52

假设有一个能装入总体积为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)

要求利用栈实现,语言为C。

最佳答案

#include<stdio.h>
#define OK 1
#define ERROR 0
#define SElemtype int
#define STACKSIZE 100



typedef struct{
SElemtype data[STACKSIZE];
int top;
} SqStack;


SElemtype Initstack(SqStack &s)//初始化栈。
{
s.top=0;
return OK;
}


SElemtype Push(SqStack &s,SElemtype e)//入栈。
{
s.data[s.top++]=e;
return OK;
}


void main()
{
int i,n,totalvol,w[STACKSIZE],sum=0,j=0;
SqStack s;
Initstack(s);
printf("请输入背包能装入的总体积:");
scanf("%d",&totalvol);
printf("请输入物品件数:");
scanf("%d",&n);
printf("请输入每件物品的体积:");
for(i=0;i<n;i++)
scanf("%d",&w[i]);
while(s.top!=-1)
{


if(sum+w[j]<=totalvol)
{
Push(s,j);
sum+=w[j];
}


if(sum==totalvol) //找到一组,退栈顶,找下一组。
{
for(i=0;i<s.top;i++)
printf("%d ",w[s.data[i]]);
printf("\n");


s.top--;
sum-=w[s.data[s.top]];
j=s.data[s.top]+1;
}


else
j++;



while(j==n) //遍历后仍未找到,则退栈。
{
s.top--;
sum-=w[s.data[s.top]];
j=s.data[s.top]+1;
}

}


}


全部回答

http://wenwen.soso.com/z/q160527925.htm

这边刚给你解决了。

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
牙齿上有个缺口,吃凉食物就痛
网线的长度和种类影响网速吗?
崇阳县百汇超市(武长街店)怎么去啊,谁知道地
我们应该怎样对待动物,我们应该怎样对待野生
格式化后,mp4里的病毒还有吗?
笔记本的IP问题
项城市鑫鑫超市地址在什么地方,想今天过去办
智能建站的软件有没有人买过试过?它们性能到
爱干净诗句,描写要爱干净的名人名言
我从小脸上就有斑,请问有什么方法可以去除它
孝南区孝感时讯数字传媒这个地址怎么能查询到
2-3日短途游去哪里好··
天津市哪个区最有钱,天津市哪个区最富裕?
开面坊赚钱
比喻句的句子晚上,伤心难过的诗句
推荐资讯
12月12日快乐大本营盛况给我讲—些?
80后剩女嫁不出去该怎么办?
河南省巩义二中2010中招分数线是多少?
一杯牛奶,妈妈喝了14
红安县翰皇擦鞋(红安县实验小学西北)地址在哪
DNF“堕落的魔石的印记”有什么用?
幸运金币可以买东西吗?
电脑连电视 用hd线
北京的地名由数字打头,写六个
几道初一英语来人
开福区原味粉馆(才子佳苑店) 特色 青椒
口袋妖怪白金版,升级全国图鉴后,为什么能遇
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?