问题如下:我们想要建造一块由 k 木板组成的木板。我们给了两种类型的木板:更短和更长。如何确定这种电路板的所有可能长度?
可以找到此问题的解决方案here。
伪代码是:
getAllLengths(k, shorterAmount, longerAmount) {
getAllLengths(k, 0, shorterAmount, longerAmount, lenghts)
}
getAllLengths(k, totalAmount, shorterAmount, longerAmount, Set lengths) {
if (k == 0) {
lengths.add(total);
return;
}
getAllLengths(k - 1, totalAmount + shorterAmount, shorterAmount, longerAmount, lengths);
getAllLengths(k - 1, totalAmount + longerAmount, shorterAmount, longerAmount, lengths);
}
例如,如果 k = 3 ,使用此解决方案,我们有2个较短的木板和1个较长的木板,可能的长度为3,4,5,6。
我不明白我们怎么能有一个长度为6的电路板?示例中不应该只有一个可能的长度吗?
答案 0 :(得分:1)
我认为你误解了这个问题。该算法永远不会考虑您拥有的每种类型木板的数量,只有您有多种长度可供选择。所以如果你调用函数:
allLengths(3, 1, 2)
您问我可以使用三个长度为一或两的混合板制作多少长度。如果你同时查看java代码和伪代码,这就是你要解决的问题。
如果你运行k = 2且长度为1和2的算法,你应该期望:
{p,{2,3,4} - 两个或长度1