您的位置:首页 > 其它

简单背包(无价值总和)问题的实现。

2008-11-14 15:14 441 查看
背包问题:从n个物件(每个物件的体积为Wi, i=1, 2, …, n)中选取若干个恰好能够填满体积为T的背包。
用栈实现,非递归解。要求解答出所有的方法!

//这是主函数
#include "stdafx.h"
#include "stack.h"
#define N 20
int W
={1,3,2,4,5,6,7,8,9,10};
void main()
{
int T=15;
int n=10,length=n;//length代表所有包的个数,而且不会改变
int i=n;//i是用来测试所有包的变量,随着程序的改变而改变
int ans=0;
SqStack S;
InitStack(S);
while(n>0)
{
for( ;i>0;i--)
{
if(T>=W[i-1])
{
Push(S,i);
T=T-W[i-1];
}
}
if(StackLength(S)==length&&T>0||StackEmpty(S)==1&&ans==0)
{
printf("%d",ans);
printf("该问题无解");
return;
}
if(StackEmpty(S)==1)
return;
if(T==0)
{
++ans;
printf("第%d种解法:",ans);
Print(S);
printf("/n/n");
}
Pop(S,i);
T+=W[i-1];
if(i==n)
i=n=n-1;
else
--i;
}
printf("共有%d种方法/n",ans);
}

//这是stack.h

#include "stdafx.h"
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#include "conio.h"
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
#define OK 1
#define ERROR 0
#define TURE 1
#define FALSE 0
#define OVERFLOW -1
typedef int Status;
typedef struct STACK SqStack;
typedef int SElemType;
extern W
;//外部变量
struct STACK
{
SElemType *base;
SElemType *top;
int stacksize;
};

Status InitStack(SqStack &S)//栈的构造
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE *sizeof(SElemType));
if(!S.base)
{
printf("分配地址失败!");
exit(OVERFLOW);
}
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status GetTop(SqStack S,SElemType &e)//用e返回栈顶
{
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return OK;
}
Status Push(SqStack &S,SElemType e)//入栈
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT) *sizeof(SElemType));
S.stacksize+=STACKINCREMENT;
if(!S.base)
{
printf("栈不存在");
exit(OVERFLOW);
}
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e)//出栈
{
if(S.base==S.top)
return ERROR;
e=*--S.top;
return OK;
}
Status StackEmpty(SqStack S)//判断是否为空栈
{
if(!S.base)
{
printf("栈不存在");
exit(OVERFLOW);
}
if(S.base==S.top)
return TURE;
else
return FALSE;
}
int StackLength(SqStack S)//栈的长度
{
if(!S.base)
{
printf("栈不存在");
exit(OVERFLOW);
}
return S.top-S.base;
}
Status ClearStack(SqStack &S)//将栈置为空栈
{
if(!S.base)
{
printf("栈不存在");
exit(OVERFLOW);
}
S.top=S.base;
return OK;
}
Status DestroyStack(SqStack &S)//销毁栈
{
if(!S.base)
{
printf("栈不存在");
exit(OVERFLOW);
}
S.base=NULL;
free(S.base);
return OK;
}
Status Print(SqStack S)//针对背包问题的打印函数
{
SElemType *p=S.top-1;
if(!S.base)
{
printf("栈不存在");
exit(OVERFLOW);
}
do
{
printf("%d ", W[*p-1]);
p--;
}while(p>=S.base);
return OK;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: