【发布时间】:2018-08-16 07:24:31
【问题描述】:
我有一组价值观。 (它的长度可以是动态的。有些值可以是未定义的)。这些值中的每一个都是一种攻击类型。
例如:attacks=[960,1200,1800,2120,undefined,undefined];
总价值,
例如:totalEnergy=18680;
现在我想要一个函数返回一个对象数组,例如,
例如:
[{
attacks: [0,0,0,0,1,2],
wastage: 128
}, {
attacks: [0,1,2,2,2],
wastage: 298
}, {
attacks: [2,3,4],
wastage: 593
}]
所以这里的攻击是可能的攻击组合,可以在给定的能量限制和剩余的能量浪费量内完成。 因此该函数将有一个名为wastage 的参数,该参数将提及可以完成的最大浪费量。 各种类型的攻击可以重复多次。但是消耗的总能量应该小于总能量。
理想情况下,高级攻击的数量是首选的,就像成本更高的攻击一样,但这取决于玩家的决定。所以我将返回所有可能的组合。玩家必须选择性价比最高的游戏。
我知道这是某种背包问题,但我尝试了多种解决方案,但没有一个能完全解决这个问题。
我通常希望此解决方案使用 javascript,但任何语言都可以用于演示目的。
更新:
这是我到目前为止所得到的,
let totalEnergy = 3400;
let attacks = [980, 1220, 1680, 1920];
let attacksPossible = attacks.map((attack, iter) => {
return Math.floor(totalEnergy/attack);
})
// Create an array which contains a repeatitive number of attacks possible
let attacksArray = attacks.map((attack, iter) => {
return [...Array(attacksPossible[iter])].map(() => attack)
})
// Flatten 2D array into 1D array
attacksArray = [].concat.apply([], attacksArray);
console.log('attacksPossible', attacksPossible);
console.log('attacksArray', attacksArray);
这里我得到了一个数组列表,其中包含给定总值的最大攻击组合,现在我该如何从这里开始实施背包呢?
【问题讨论】:
-
您尚未发布任何您尝试过的代码 - 这听起来像是要求 SO 为您编写整个脚本,这不是本网站的工作方式。请查看How to Ask
-
好的,我不需要完整的代码。我只需要一个关于如何解决这个问题的想法。
-
@CertainPerformance 好的,我已经更新了我尝试过的代码,
标签: javascript algorithm knapsack-problem