我有以下问题:我有一个固定的 总和[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];
[30]
[0.99,
1.99,
0.99,
4.99,
6.99,
1.99,
2.99,
4.99
2.99]
[1.09]
[30]
[7.99,
6.99,
4.99,
6.99,
1.99,
[1.05]
答案 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);