我想了解在课堂上给予我的背包算法,特别是下面的伪代码。重复背包 - 数组解决方案
这是我尝试编写它:
//Init array
var solution = [];
var items = problem.items;
var sackSize = problem.knapsack;
solution[0] = 0;
for(var k = 1; k <= sackSize; k++)
{
var loot = 0;
for(var i = 1; i <= items.length; i++)
{
if(k >= items[i].weight)
{
loot = Math.max(loot, items[i].value)
}
}
solution[k] = loot;
}
这没有意义,我因为if(k >= items[i].weight)
总是给人一种“索引超出界限”错误上的最后一次迭代循环。 items
数组从0开始,但i
从1开始。为什么我们从索引1开始?我误解了变量吗?
我给出:
对象问题包括背包 (problem.knapsack)的最大重量和可用项(problem.items)的阵列。 每个项目都是一个具有重量和价值属性 (problem.items [i] .weight和problem.items [i] .value)的对象。这两个 函数都应返回一个选定项目的数组。 返回数组中的项目也应该具有权重和值属性。
在伪代码中,从'1'到'n'而不是从'0'到'n-1'的迭代是很常见的。仅仅因为伪代码从“1”迭代到“n”并不意味着您的代码也必须从“1”迭代到“n”,特别是当您知道数组索引从“0”开始时。 – wookie919
@ wookie919所以你认为解决方案不依赖于它从1开始? – Deekor