#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;
}