【发布时间】:2020-03-01 16:05:37
【问题描述】:
我正在处理一个硬币和问题:
给定一组可用面额和目标金额,我想获得总和达到该目标金额的组合数量。每个教派我都可以随心所欲。
示例:
输入:
- 面额:[1, 5, 10]
- 目标数量:10
预期输出:4
说明:我可以对相应的面额进行以下计数:
[10, 0, 0], [5, 1, 0], [0, 2, 0] 或 [0, 0, 1]
我的代码
function func(denomenations, targetSum) {
let totalCombos = 0;
function generate(denomsLeft, remainder) {
if(remainder === 0){
totalCombos += 1;
return
}
if(remainder - denomsLeft[0] >= 0) {
generate(denomsLeft, remainder - denomsLeft[0])
}
if(remainder - denomsLeft[1] >= 0) {
denomsLeft.splice(0,1)
generate(denomsLeft, remainder - denomsLeft[0])
}
}
generate(denomenations, targetSum)
return totalCombos
}
问题
我确定我的解决方案非常接近,但有点不对劲。
调用 func([1,5,10],10) 返回 3 而不是 4。我似乎没有得到 5 & 5 = 10 的硬币组合。
错误在哪里,我该如何解决?
【问题讨论】:
-
欢迎来到Stack Overflow!很不清楚你在问什么——为什么函数应该返回 4 或任何东西?它应该做什么?请edit澄清。 (PS,如果您要计算总和为目标的组合,我只会将有效组合生成为列表,在 sum == 目标上过滤它们,然后返回该列表的长度)
-
.splice改变数组。我宁愿在那里做denomsLeft = denomsLeft.slice(1);。 -
@d.ben 至少对我来说很清楚......而且您提出的解决方案不适用于无限数量的可能组合。 OP 提出的解决方案效率更高。
-
@D.BenKnoble 这个算法是一个经典的组合问题,我需要找出在给定一定数量的面额的情况下,你可以用多少种方法来换取一定数量的钱。在我的示例中,我正在寻找添加到 10 个给定面额 [1,5,10] 的组合。这里的答案是 4 种组合,但是我的实现只返回 3 种组合
-
....您尝试调试什么问题?
标签: javascript algorithm debugging recursion combinations