问题描述:
总体积为T的背包,n件物品体积分别是w1,w2,...,wn,找出若干件恰好装满背包。找出满足条件的解。
例如,当T=10时,各件物品的体积时{1,8,4,3,5,2}时,可找到下列4组解:
(1,4,3,2),(8,2),(1,4,5),(3,5,2)。
提示:
(1)将物品顺序选取到背包中。假设选取了钱i件物品之后背包还没有装满,则继续选取第i+1件物品。
(2)若改件物品太大,不能装入,则弃之选取下一件,直至背包装满为止。
(3)但如果在剩余的物品中找不到合适的物品填满背包,则说明刚刚装入背包的那件物品不合适,应该将它取出来,继续从它的后面选取。
(4)如此重复,直到求的满足的条件的解,或者无解。
#include<stdio.h>
//结构体,里面有相应的物品的体积,和该物品所在数组的下标值
typedef struct
{
int index;//下标
int data;//体积
}datatype;
int findway(int tatol,datatype weight[])
{
int lensize=6,top=0;
int i,j;
datatype stack[6];
int T=tatol; //T为背包剩余体积
for(i=0;i<lensize;i++)//找到第一个可以小于背包体积的物品,放入背包
{
if(weight[i].data<=T)
{
stack[top]=weight[i];
T=T-weight[top].data;
top++;
i++;
break;
}
}
j=i;//j为下一个物品的下标
while(T>=0)//
{
if(T==0)//剩余体积为0时,返回物品体积大小序列
{
for(j=0;j<top;j++)
{
printf("%5d",stack[j].data);
}
printf("\n");
return 1;
}
else//剩余体积不为0时。检查下一个可以放入的物品体积
{
for(;j<lensize;j++)
{
if(weight[j].data<=T)
{
stack[top]=weight[j];
top++;
T=T-weight[j].data;
}
}
if(T>0)//检查过一遍,还是T>0,退栈,在退栈的那个物品的下一个开始找气
{
top--;
j=stack[top].index+1;
T=T+stack[top].data;
}
}
}
}
void main()
{
int tatol=10;
int size[]={8,1,4,3,5,5};
datatype weight[10];
for(int i=0;i<6;i++)
{
weight[i].index=i;
weight[i].data=size[i];
}
findway(tatol,weight);
}