如何通过迭代解决0-1包问题?

时间:2011-04-17 13:58:39

标签: c++ algorithm recursion iteration

  

可能重复:
  Design patterns for converting recursive algorithms to iterative ones

我只能想出一种递归方式: 如何将其转换为迭代? 为简单起见,我的递归方式只能找到结果值。

#include<iostream>
//0-1 bag
using namespace std;
int weight[5]={50,30,45,25,5};
int value[5]={200,180,225,200,50};

int valueAfterTake(int objectNO, int bagSpaceLeft)
{
    int take,notTake;
    if(objectNO < 0)
    {
        return 0;
    }
    else
    {
        take = value[objectNO] + valueAfterTake(objectNO - 1,bagSpaceLeft - weight[objectNO]);
        notTake = valueAfterTake(objectNO - 1, bagSpaceLeft);
    }
    if(weight[objectNO] > bagSpaceLeft)
    {
        return notTake;
    }

    if(take > notTake)
    {
        return take;
    }
    else
    {
        return notTake;
    }
}


int main()
{
    cout<<valueAfterTake(4,100)<<endl;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

鉴于你真正想要的是什么,我认为这是Design patterns for converting recursive algorithms to iterative ones

的重复问题

答案 1 :(得分:1)

0-1 knapsack problem中的算法可以将所有内容放在i和w的表中 制作一个填充NO_VALUE常量的两个缩小表(-1或类似的东西) 然后,当你需要得到m [i,w]的值时,你会找到你需要的表中的索引,检查它们是否计算出来(通过比较NO_VALUE),如果没有则计算它们。
在这里,您将在空间权衡中获得更少的代码执行,因为您永远不会计算两次相同的值 编辑:
此外,从那里你可以继续找到模式,比如你总是使用一行,或者一个对角线等,并删除表中不需要的所有内容。