假设您想尝试以尺寸递减的顺序安装管道,并且您可以访问所需的功能,您可以使用 Reduce 作为演示 here 来遍历尺寸并连续除以每个尺寸,尽管公式有点小辛苦了:
=LET(pipes,{500;250;200;100;50},reqd,750,DROP(REDUCE(0,pipes,
LAMBDA(a,c,VSTACK(a,QUOTIENT(reqd-IF(ROWS(a)>1,SUM(DROP(a,1)*TAKE(pipes,ROWS(a)-1)),0),c)))),1))
正如@Jos Woolley 所指出的,如果总数大约为 749,这可能不会给您想要的答案。它将尽可能多地包含值,并给出 500+200 的结果,总计 700(余数 49)。您可以通过四舍五入到下一个 50 的倍数来修复它。
对于 823 的示例,您将拥有:
=LET(pipes,{500;250;200;100;50},reqd,CEILING(823,MIN(pipes)),DROP(REDUCE(0,pipes,
LAMBDA(a,c,VSTACK(a,QUOTIENT(reqd-IF(ROWS(a)>1,SUM(DROP(a,1)*TAKE(pipes,ROWS(a)-1)),0),c)))),1))
得出 500+250+100=850。
好吧,我现在对此有点着迷,我决心让 lambda 工作以找到最佳答案!我一直在研究前面提到的参考资料中的强力解决方案,并设法使用 Reduce 将其转换为 lambda:
Mincoins1= LAMBDA(coins, m, v,
IF(
v <= 0,
0,
REDUCE(
999,
coins,
LAMBDA(a, c,
IF(v >= c, LET(mc, mincoins1.mincoins1(coins, m, v - c) + 1, IF(mc < a, mc, a)), a)
)
)
)
)
当您想从给定的管道列表中组成值 400 时,这确实给出了正确答案 2。下一步将是修改代码以返回给出总数 (200,200) 的管道列表。
https://www.enjoyalgorithms.com/blog/minimum-coin-change