您的位置:首页 > 其它

0-1背包问题,非递归遍历

2010-10-05 21:56 260 查看
#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
= {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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: