如何找到由木板组成的所有可能长度的板?

时间:2018-04-08 19:10:35

标签: algorithm recursion

问题如下:我们想要建造一块由 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的电路板?示例中不应该只有一个可能的长度吗?

1 个答案:

答案 0 :(得分:1)

我认为你误解了这个问题。该算法永远不会考虑您拥有的每种类型木板的数量,只有您有多种长度可供选择。所以如果你调用函数:

allLengths(3, 1, 2)

您问我可以使用三个长度为一或两的混合板制作多少长度。如果你同时查看java代码和伪代码,这就是你要解决的问题。

如果你运行k = 2且长度为1和2的算法,你应该期望:

{p,{2,3,4}     - 两个或长度1
    - 长度1和长度2之一     - 长度为2的两个。