//stack.h //

#include<iostream>
using namespace std;

typedef int ElemType;

typedef struct NodeType{
 ElemType data;
 NodeType *next;
}NodeType,*LinkStack;                  

void InitStack(LinkStack &S)               //初始化栈
{
 S=NULL;
} //InitList


bool pop_stack(LinkStack &S, ElemType &e)        //出栈
{
 NodeType *p;
 p=new NodeType;
 if(S){
  p=S;S=S->next;
  e=p->data;
  delete p;
  return true;
 }
 else return false;
}

void push_stack(LinkStack &S, ElemType e)        //进栈
{
 NodeType *p;
 p=new NodeType;
 p->data=e;
 p->next=S;
 S=p;
}

void StackTraverse(LinkStack &S, int *w)           //输出栈里的数据
{
 
 NodeType *p,*p1;
 LinkStack S1;InitStack(S1);
 p=new NodeType;
 p1=new NodeType;
 p=S;
    while(p!=NULL){
  push_stack(S1, w[p->data]);
  p=p->next;
    }
 p1=S1;
 cout<<"可行的解是:";
 while(p1!=NULL){
  cout<<w[p1->data]<<" ";
  p1=p1->next;
    }
    cout<<endl;/*
 

 
 NodeType *p;
 p=new NodeType;
 p=S;
 cout<<"可行的解是:";
    while(p!=NULL){
   cout<<w[p->data]<<" ";
   p=p->next;
   }
   cout<<endl;*/
 
}

bool stackempty(LinkStack &S)        //判断栈是否为空
{
 if(S==NULL)
  return true;
 else return false;
}

 

// 背包问题.cpp  //

#include"stack.h"

void bag(int *w,int T,int n)
{
 LinkStack S;
 InitStack(S);
 int k=0;
 do
 {
  while(T>0&&k<n){
   if(T-w[k]>=0){
    push_stack(S,k);T=T-w[k];
   }
   k++;
  }
  if(T==0)StackTraverse(S,w);
  pop_stack(S,k);T=T+w[k];
  k++;
 }while (!stackempty(S)||k<n);
}

void main()
{
 int T;//背包的体积
 cout<<"请输入背包的体积:";
 cin>>T;
 cout<<"请输入物品的体积,以 # 结束:";
 int x,w[100],i=0;//物品体积
 while(cin>>x)
 {
  w[i]=x;i++;
 }
 bag(w,T,i);
}

posted on 2013-04-29 11:09  向云武  阅读(88)  评论(0编辑  收藏  举报