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; }
相关文章推荐
- 按位操作符与背包问题的遍历
- 递归-背包问题
- 回溯法解决0_1背包问题(迭代和递归)
- 0-1背包问题(递归解决)
- 动态规划:0-1背包问题(使用递归方法)
- 递归-I-背包问题
- 非递归 做八皇后问题--利用遍历函数(next_permetation)
- 背包问题的递归形式解
- 背包问题选中递归求解0 1背包问题
- 0/1背包问题(递归解决,递推解决)
- 递归实现背包问题(C#)
- 关于背包问题的递归解法
- 背包问题的递归与非递归算法
- 数据结构学习-递归(背包问题)
- 九度 1543 无限完全二叉树的层次遍历(递归问题)
- 背包问题的递归与非递归求解
- 递归与递推 遍历问题
- 简单的背包问题--java递归实现
- 递归5_简单的0/1背包问题
- 先序遍历用于优化树形分组背包问题