Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Arrays_Loops_For Loop - Fatal编程技术网

Javascript 如何循环遍历一个数字数组,以查看哪些数字与另一个数字相关?

Javascript 如何循环遍历一个数字数组,以查看哪些数字与另一个数字相关?,javascript,arrays,loops,for-loop,Javascript,Arrays,Loops,For Loop,我正在尝试用香草JavaScript编写一个简单的举重程序。用户输入一定量的重量,然后返回要放在杠铃两侧的特定重量板 然后,我把这个数字代入一个函数,从中减去45,算出杠铃的重量,然后将这个数字除以2,这是放在杠铃两侧的重量 const num = document.getElementById("weightAmount").value; function getWeightAmount (num) { const newNum = num - 45; const halfNum = new

我正在尝试用香草JavaScript编写一个简单的举重程序。用户输入一定量的重量,然后返回要放在杠铃两侧的特定重量板

然后,我把这个数字代入一个函数,从中减去45,算出杠铃的重量,然后将这个数字除以2,这是放在杠铃两侧的重量

const num = document.getElementById("weightAmount").value;

function getWeightAmount (num) {
const newNum = num - 45;
const halfNum = newNum / 2;
return getWeights(halfNum);
}
我有一个阵列,每个重量板:

let plates = [44, 33, 22, 11, 5.5, 2.75];
我在正确循环数组以获取所需内容时遇到问题。如果我需要,比如说,每边60.5磅,它应该返回44,11,5.5磅。因此,我需要找出
板中的哪些数字符合从第一个函数返回的数字

我有一个名为
weights
的空数组,我想将
plates
数组中的数字与返回的权重一起推送到该工作中


我的问题是如何循环通过
数组来确定需要哪些权重

这里有一个解决方案。如果可用板的总重量不等于目标重量,它将返回最接近目标的可用板的组合。改编自

函数创建子集(数字、目标){
//筛选出大于目标的所有项目
数字=数字。过滤器(函数(值){

返回值如果目标重量的值始终是可用板的总和,我有一个简单的解决方案。假设重量数组按降序排序。我循环考虑所有可用重量,并且仅当总重量超过您所需的总重量时,才会进入下一个重量

function getWeights(targeWeight) {

    let plates = [44, 33, 22, 11, 5.5, 2.75];

    let totalWeight = 0;

    let neededPlates = [];

    let i = 0;

    while(i < plates.length){

        var pweight = totalWeight + plates[i];

        if (pweight > targeWeight) {
            i++;
            continue;
        }

        totalWeight += plates[i];
        neededPlates.push(plates[i]);
    }

    return neededPlates;
}

console.log(getWeights(60.5)); // [44, 11, 5.5]
console.log(getWeights(104.5)); //[44, 44, 11, 5.5]
函数getWeights(targetwight){
设板块=[44,33,22,11,5.5,2.75];
总重量=0;
设所需板=[];
设i=0;
而(i<板长){
var pweight=总重量+板[i];
如果(重量>目标重量){
i++;
继续;
}
总重量+=板[i];
需要的板。推(板[i]);
}
返回需要的板;
}
console.log(getWeights(60.5));//[44,11,5.5]
console.log(getWeights(104.5));//[44,44,11,5.5]

一个可能的解决方案是无限期地迭代,直到

  • 你有办法了
  • 给定一组权重,问题就无法解决
在每个迭代步骤中,将可能的最高权重减去可能的最高因子,将两者存储在适当的数据结构中(我的实现只是使用一个
对象
),然后继续

const plates=[44,33,22,11,5.5,2.75];
//我们假设盘子总是被分类的
常量确定权重=(总权重)=>{
设系数=0;
让权重={};
而(总重量>0){
重量=板。查找(重量=>数学地板(总重量/重量)>0);
//我们不能从总重量中减去重量来解决这个问题
//因此,问题是无法解决的,我们返回null表示不存在解决方案
如果(!weight){返回null;}
//在我们从总重量中减去乘积之前,先确定乘以重量的系数
系数=数学地板(总重量/重量);
总重量=总重量-系数*重量;
//存储权重和因子
权重[权重]=系数;
}
返回权重;
}
log(determineWeights(104.5));/{“11:1”,44:2,5.5:1}
log(determineWeights(60.5));/{“11:1”,44:1,5.5:1}

console.log(determineWeights(5.0));//null
找到只除以一次目标重量的重量,将其添加到杠铃并从目标重量中减去。重复此操作,直到目标重量为零。使用
plates.forEach(函数(plate){}
for
for(let plate of plates){}
可能相关:正如@FK82所提到的,这是一个背包,但有点修改。它实际上是一个变更问题的修改版本[,这本身就是背包问题的一个修改版本。@Taylorg:您可以按照下面给出的答案,在伪多项式时间内使用动态规划来编写自己的解决方案,也可以直接使用下面给出的解决方案,非常完美!谢谢!
function getWeights(targeWeight) {

    let plates = [44, 33, 22, 11, 5.5, 2.75];

    let totalWeight = 0;

    let neededPlates = [];

    let i = 0;

    while(i < plates.length){

        var pweight = totalWeight + plates[i];

        if (pweight > targeWeight) {
            i++;
            continue;
        }

        totalWeight += plates[i];
        neededPlates.push(plates[i]);
    }

    return neededPlates;
}

console.log(getWeights(60.5)); // [44, 11, 5.5]
console.log(getWeights(104.5)); //[44, 44, 11, 5.5]