Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过迭代解决0-1包问题?_C++_Algorithm_Recursion_Iteration - Fatal编程技术网

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

C++ 如何通过迭代解决0-1包问题?,c++,algorithm,recursion,iteration,C++,Algorithm,Recursion,Iteration,可能重复: 我只能想出一个递归的方法: 如何将其转换为迭代? 为了简单起见,我的递归方法只能找到结果值 #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;

可能重复:

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

#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袋
使用名称空间std;
整数权重[5]={50,30,45,25,5};
int值[5]={200180225200,50};
int-valueAfterTake(int-objectNO,int-bagspace-left)
{
int take,notTake;
if(objectNO<0)
{
返回0;
}
其他的
{
take=值[objectNO]+值AfterTake(objectNO-1,bagSpaceLeft-重量[objectNO]);
notTake=valueAfterTake(objectNO-1,bagspace左);
}
if(重量[objectNO]>bagSpaceLeft)
{
回程通知;
}
如果(采取>不采取)
{
回采;
}
其他的
{
回程通知;
}
}
int main()
{

考虑到你真正想要的,我认为这是一个重复的问题,从中的算法可以把所有的东西都放在一个I和w的表中。
制作一个两位数的表格,填充无值常数(-1或类似值)。
然后,当您需要获取m[i,w]的值时,您可以从表中找到所需的索引,检查它们是否已计算(通过与NO_值进行比较),如果未计算,则进行计算。
在这里,在空间权衡中,您将获得更少的代码执行,因为您永远不会计算相同的值两次。
编辑:

此外,从那里您可以继续查找模式,比如您总是使用一行或一条对角线之类的,并删除表中不需要的所有内容。

什么是“0-1包问题”我想他指的是0-1背包算法,而这是0-1背包算法,我不是以英语为母语的人,所以我只是翻译了这个名字。