#include <iostream>  
#include <stack>
using namespace std;

#define N 6
int iW[] = {8, 2, 6, 4, 3, 1};                    //    背包重量
int iV[] = {9, 3, 13, 10, 12, 5};                //    背包价值

stack<int>    iStack;        
int i = 0;
int iCurW = 0;                                    //    当前所选的总重量
int iCurV = 0;                                    //    当前所选的总价值

int iCopyStack[N] = {0};                                //    只是为了遍历打印出栈信息
int iCopyStackSize = 0;                                    //    模拟栈大小

int iMaxV = 0;                                    //    最大价值
int iMaxW = 20;                                    //    最大重量限制

void PrintStack()
{
    printf("\t\t");
for (int i = 0; i < iCopyStackSize; ++i)
        printf("%d  ", iCopyStack[i]);
    printf("\n");
}

void Push(int i)
{
    iStack.push(i);
    iCurW += iW[i];
    iCurV += iV[i];

if (iCurV >= iMaxV)
    {
        printf("push(%d), CurW(%d), CurV(%d)\n", i, iCurW, iCurV);
        iMaxV = iCurV;
    }

    iCopyStack[iCopyStackSize++] = i;

    PrintStack();
}


bool Pop(int &i)
{
if (iStack.empty())
    {
        printf("================  Stack is empty, need quit\n");
return false;
    }

    i = iStack.top();
    iStack.pop();
    iCurW -= iW[i];
    iCurV -= iV[i];
//    printf("\tPop(%d), CurW(%d), CurV(%d)\n", i, iCurW, iCurV);

    iCopyStackSize--;
    PrintStack();
return true;
}

void CodeWrapper()
{
while (1)
    {
if (i < N && iCurW + iW[i] <= iMaxW)            //    如果可以选择
        {
            Push(i);
            i++;
        }
else
        {
if (i >= N)                                    //    已经选择最后一个包了
            {
if (!Pop(i))
break;
                i++;
            }
else
            {
                i++;
            }
        }
    }

}


int main()  
{  
    CodeWrapper();
    system("pause");
return 0;  
}