java - Java中的递归动态规划背包解决方案

标签 java recursion

我编写了这个动态函数来查找背包问题的最大打包值。

static int dyn(int maxItems, int maxSize)
    {
        if(maxItems < 0)
        {
            return 0;
        }
        if(tab[maxItems][maxSize] != -1)
        {

            return tab[maxItems][maxSize];
        }

        if( itemArray[maxItems].s > maxSize)
        {
            result =  dyn(maxItems-1,maxSize);
            return result;
        }
        else
        {
            result =  Math.max(dyn(maxItems-1, maxSize), dyn(maxItems-1, maxSize - itemArray[maxItems].s) + itemArray[maxItems].v);
            tab[maxItems][maxSize] = result;
            return result;
        }

    }

我从 main 调用这个函数

int x = dyn(maxItems - 1, maxSize)

itemArray 结构是

public class Item {
 int v;
 int s;
}

每次我得到的答案都是 0。请告诉我哪里出错了

最佳答案

删除检查 tab[][] != -1if 循环。这永远是正确的,并且它下面的实际背包递归永远不会运行。我假设您用项目填充 itemArray 。现在这应该可以了。

static int dyn(int maxItems, int maxSize)
{
    if(maxItems < 0)
    {
        return 0;
    }

    if( itemArray[maxItems].s > maxSize)
    {
        return dyn(maxItems-1,maxSize);
    }
    else
    {
        int result =  Math.max(dyn(maxItems-1, maxSize), dyn(maxItems-1, maxSize - itemArray[maxItems].s) + itemArray[maxItems].v);
        tab[maxItems][maxSize] = result;
        return result;
    }
}

关于java - Java中的递归动态规划背包解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23305119/

相关文章:

java - 访问 Box2D 灯光转换的光线

java - 从 List<E> 中取 n 个随机元素?

java - 如何使用 JSP 删除表中的行。错误 : NumberFormatException: null. -> Integer.parseInt(来源未知)

java - FlatFileItemWriter 在每个 JobExecution 上写入新的(不存在的)文件

recursion - 普通口齿不清 : Recursive "is-equal" function - results are incorrect

algorithm - 创建交替链的最少切换

java - 在 Eclipse 中将用户库定义为项目的一部分而不是工作区

java - 确定每行代码的成本和时间并计算时间复杂度

javascript - 如何将 JavaScript 对象扁平化为类似菊花链的形式?

PHP MySQL递归慢,如何加速?