简单背包(无价值总和)问题的实现。
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;
}
用栈实现,非递归解。要求解答出所有的方法!
//这是主函数
#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;
}
相关文章推荐
- [算法]简单的背包问题递归解法,C语言实现
- 简单背包问题的递归与非递归实现
- 简单背包问题-递归非递归实现
- 简单的[0/1]背包问题 分别用递归与非递归实现
- 简单的背包问题--java递归实现
- 最简单的0-1背包问题c++代码实例及运行结果
- RF框架-一个简单的脚本实现及元素定位不到问题的解决
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
- 简单DP之最少硬币问题(多重背包问…
- merker—hellman背包加密的C语言简单实现
- 【完全背包问题】有1,2...K种类型的dollar,求组成价值为N的方法有多少种
- Java实现-背包问题I
- 简单背包问题模板
- 01背包问题的java界面实现
- 简单背包问题+打印路径
- API接口非幂等性问题及使用redis实现简单的分布式锁
- NGUI简单背包系统的实现
- 京东金融曹鹏:通过JDD大赛,实现“比你更懂你”的极致价值,让金融更简单,更平等
- 简单背包问题
- 简单:01背包问题