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

 

posted on 2010-10-05 21:56  venxman  阅读(230)  评论(0编辑  收藏  举报