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

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

//这是主函数
#include "stdafx.h"
#include "stack.h"
#define N 20
int W[N]={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[N];//外部变量
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;
}

你可能感兴趣的:(简单背包(无价值总和)问题的实现。)