//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);
}