从数组中选择一个随机元素,重复直到满足条件

时间:2019-06-19 08:28:21

标签: javascript arrays sum fixed

我有以下问题:我有一个固定的 总和[30]和数字数组。我的问题是如何从总和中减去num的随机数,直到我得到其余的数字> 1、2,例如1.09或1.05?

var num= [0.99, 1.99, 2.99, 3.99, 4.99, 5.99, 6.99, 7.99, 8.99, 9.99];
var sum= [30];

console.log()

[30]

[0.99,
1.99,
0.99,
4.99,
6.99,
1.99,
2.99,
4.99
2.99]

[1.09]

console.log(再次)

[30]

[7.99,
6.99,
4.99,
6.99,
1.99,

[1.05]

2 个答案:

答案 0 :(得分:1)

您需要在此处使用 0/1 背包动态编程。这是标准的背包问题。

假设您正在尝试输入第一个数字。您可以从总和中减去该数字,也可以忽略该数字。因此,您将尝试所有可能。这种参加/不参加被称为 0/1 背包。

您可以通过以下链接学习 0/1 背包:https://www.geeksforgeeks.org/0-1-knapsack-problem-dp-10/

答案 1 :(得分:0)

该函数希望给它一个目标总和(作为一个数字,而不是包含1个元素的数组),可能的减法值数组和一个包含2个元素的目标数组-最小值和最大值。

var num = [0.99, 1.99, 2.99, 3.99, 4.99, 5.99, 6.99, 7.99, 8.99, 9.99];
var sum = 30;
var target = [1, 2];

function subtract(sum, num, target) {

  // pick a random index of whatever array is provided.
  const randomIndex = Math.round((num.length - 1) * Math.random());

  // * 100 / 100 is to successfully round to the 2nd decimal place.
  const newSum = Math.round((sum - num[randomIndex]) * 100) / 100;

  if (newSum >= target[1]) {
    console.log(`Subtracted ${num[randomIndex]}. Result is ${newSum}.`);
    subtract(newSum, num, target);
  }
  else if (newSum > target[0] && newSum <= target[1]) {
    console.log(`Subtracted ${num[randomIndex]}. Result is ${newSum}. Done.`);
  }
  else {
    console.log(`Couldn't subtract ${num[randomIndex]}. Result is ${sum}.`);
    subtract(sum, num, target);
  }
}

subtract(sum, num, target);