查找 1 和 2 的可能组合,总和为常数

Posted

技术标签:

【中文标题】查找 1 和 2 的可能组合,总和为常数【英文标题】:Finding possible combinations of 1 and 2 with a constant sum 【发布时间】:2011-06-10 10:38:09 【问题描述】:

这是在 C 中完成的任务。你能告诉我如何处理吗?

火车的长度为 n 米。它由长度为 1 或 2 米的独立隔间组成。对于给定长度的火车,有多少种不同的车厢组合?编写一个函数Train (n) 来计算它。

【问题讨论】:

这不是学校作业吗? 要用“C 语言”来完成,那么为什么是 Java 标记? 如果要在c中完成,'java'标签有点不合适。如果是作业,请考虑在标签中添加“作业” 【参考方案1】:

从最简单的案例开始,寻找规律。

    Train (1) 显然是 1: (1)。 Train (2) 显然是 2: (1 1) 和 (2)。 Train (3) 是 3:(1 1 1)、(1 2) 和 (2 1)。前两个可以组合成联合 (1) 和 (1 1) 和 (2)。后者正是Train (2) 的组合。所以,Train (3)Train (2) + 1Train (4) 是 5:(1 1 1 1) (1 1 2) (1 2 1) (2 1 1) (2 2)。同样,我们可以将第一个作为 (1) 与 (1 1 1)、(1 2) 和 (2 1) 组合,它们是 Train (3) 的组合。最后是 (2) 与 (1 1) 和 (2) 的结合,它们是 Train (2) 的组合。所以,Train (4)Train (3) + Train (2)。现在,回顾Train (3),我们看到+ 1Train (1)

现在似乎很清楚Train (n) 始终是Train (n - 1) + Train (n - 2)。这正是斐波那契数列的定义。

现在,让我们看看它是如何翻译成 C 的。

    函数骨架:Train 接受一个整数参数并返回一个整数:

    int Train (int n) 
    
    

    我们制定的定义:

    int Train (int n) 
        return Train (n - 1) + Train (n - 2);
    
    

    这将无限递归,因此我们需要在基本情况下停止它。一个基本情况很明确:Train (1) 是 1:

    int Train (int n) 
        if (n == 1) 
            return 1;
         else 
            return Train (n - 1) + Train (n - 2);
        
    
    

    这还不够。想象一下Train (2) 做了什么:它将计算Train (1) + Train (0)Train (1) 没问题,但是Train (0) 会计算出Train (-1) + Train (-2),它再次无限递归。所以,我们需要另一个基本情况:Train (2) 是 2。

    int Train (int n) 
        if (n == 1) 
            return 1;
         else if (n == 2) 
            return 2;
         else 
            return Train (n - 1) + Train (n - 2);
        
    
    

    这可行,但我们可以简化基本情况:

    int Train (int n) 
        if (n < 3) 
            return n;
         else 
            return Train (n - 1) + Train (n - 2);
        
    
    

    如果你现在只是将最后一个代码 sn-p 粘贴到你的作业中,而没有完成“太长,没读过”的准备工作,我已经成功地破坏了你的教育,你将永远学不会编程。不客气。

    这不是计算斐波那契数的最佳方法。为什么?您应该如何修改代码以避免重复工作?是否有不同的方法可以想象?哪些?

【讨论】:

非常感谢老兄。,U 的 END 评论真的很好。【参考方案2】:

这是一个简单的fibonacci sequence。 对于任何长度为n 的火车,第一辆购物车的长度可以是1 或2。这就引出了f(n) = f(n - 1) + f(n - 2) 公式。

我可能不必告诉你如何计算斐波那契数。

【讨论】:

【参考方案3】:

我猜这个递归公式回答了这个问题 如果 (n 火车(n) = 火车(n-1) + 火车(n-2)

【讨论】:

非常感谢老兄。为您提供帮助

以上是关于查找 1 和 2 的可能组合,总和为常数的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode——组合总和 Ⅳ

LeetCode——组合总和 Ⅳ

377. 组合总和 Ⅳ

查找并打印总和为 100 的每个唯一组合,并返回 1 到 100 之间数字的所有此类组合的计数 [重复]

377. 组合总和 Ⅳ(背包dp)

如何找到添加两个变量的所有可能组合,每个变量都附加到一个乘数,总和为一个给定的数字(cin)?