/*
有N件物品,每件物品都有相应的重量,现在有一个背包,
背包只能装count公斤的物品,问背包装满count公斤,有多
少中装法?物品不得重复。
*/
#include <iostream>
using namespace std;
#define N 8 //N为 多少件物品
int array[8] = {1,2,3,4,5,6,7,8}; //每个物品的重量
int count = 10; //要求装10公斤的物品
typedef struct stack
{
int top;
int max;
int * ptr;
}stack;
void init(stack & mystack)
{
mystack.top = -1;
mystack.max = 10;
mystack.ptr = new int[mystack.max];
}
void push(stack & mystack,int value)
{
if (mystack.top < mystack.max)
{
mystack.top++;
mystack.ptr[mystack.top] = value;
}
}
int pop(stack & mystack)
{
int value = 0;
if ( mystack.top == -1)
return value;
else
{
value = mystack.ptr[mystack.top];
mystack.top--;
}
return value;
}
int isempty(stack & mystack)
{
if (mystack.top == -1)
return -1;
else
return 0;
}
void traver(stack & mystack)
{
int i = 0;
while ( i<=mystack.top )
{
cout<<array[mystack.ptr[i]]<<" ";
i++;
}
cout<<endl;
}
int main(int argc, char* argv[])
{
int i=0;
stack mystack;
init(mystack);
/*当栈非空,或者栈空,但未遍历完array时*/
while ( !isempty(mystack) || isempty(mystack)&&i<N )
{
while (count > 0 && i<N) //当余下的重量还大于0时,且还未遍历完array时
{
count-=array[i]; //余下的重量减去将入栈的物品重量
push(mystack,i); //入栈
i++; //array往后遍历
}
if (count == 0) //如果达到要求,则输出
{
traver(mystack);
}
i = pop(mystack); //此时必然要出栈一个
count+=array[i]; //余下的重量加出栈的物品重量
i++; //array往后遍历
}
return 0;
}