Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.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
Javascript 一种算法,用于找到可重复的值集,以适应最大总值_Javascript_Algorithm_Knapsack Problem - Fatal编程技术网

Javascript 一种算法,用于找到可重复的值集,以适应最大总值

Javascript 一种算法,用于找到可重复的值集,以适应最大总值,javascript,algorithm,knapsack-problem,Javascript,Algorithm,Knapsack Problem,我有一套价值观。(长度可以是动态的,有些值可以是未定义的)。这些值中的每一个都是攻击类型 例如:attacks=[960120018002120,未定义,未定义] 和总价值 例如:totalEnergy=18680 现在我需要一个函数来返回一个对象数组,比如 例: 因此,这里的攻击是可能的攻击组合,可以在给定的能量限制和剩余的能量消耗量内完成。 因此,该函数将有一个名为wastage的参数,该参数将提到可以完成的最大浪费量。 各种类型的攻击可以重复多次。但是所消耗的总能量应该小于总能量 理想情况

我有一套价值观。(长度可以是动态的,有些值可以是未定义的)。这些值中的每一个都是攻击类型

例如:
attacks=[960120018002120,未定义,未定义]

和总价值

例如:
totalEnergy=18680

现在我需要一个函数来返回一个对象数组,比如

例:

因此,这里的攻击是可能的攻击组合,可以在给定的能量限制和剩余的能量消耗量内完成。 因此,该函数将有一个名为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);

这里我得到了一个数组列表,其中包含给定总值的最大攻击组合,现在我如何从这里开始在其上实现背包?

背包在这里并不真正相关,因为您需要所有选择。这与将一组数字划分为n和的所有方法更为相似,只是可能会产生浪费。该方法与此相同,只是稍作修改:

设总能量=3400;
让攻击=[980,1220,1680,1920];
让可能性=[];
让电流=[];
让minVal=Math.min.apply(null,攻击);
函数求解(idx,左){
for(var i=idx;iif(攻击[i]!=未定义和攻击[i]您还没有发布任何您尝试过的代码-这听起来像是请求SO为您编写整个脚本,而这不是本网站的工作方式。请检查确定我不需要完整的代码。我只需要了解如何解决此问题。@CertainPerformance确定我已更新了我尝试过的代码,
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);