【问题标题】:how to solve 0-1 package problem by iteration? [duplicate]如何通过迭代解决0-1包问题? [复制]
【发布时间】:2011-08-07 07:51:27
【问题描述】:

可能重复:
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;
}

【问题讨论】:

  • 什么是“0-1包问题”?
  • 我认为他指的是0-1背包算法
  • 虽然是0-1背包算法,我不是英语母语所以我只是翻译了名字。

标签: c++ algorithm recursion iteration


【解决方案1】:

鉴于您真正想要的,我认为这是Design patterns for converting recursive algorithms to iterative ones的重复问题

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2021-11-12
      • 1970-01-01
      相关资源
      最近更新 更多