题目:
将 𝑛 分成若干个大于 0 的数的和,按照字典序输出所有方案。
输入数据
一个数 𝑛 ( 1≤𝑛≤15 )。
输出数据
按照字典序,输出所有方案。数字之间,用空格划分。
数据范围
对于 100% 的数据, 1≤𝑛≤15 。
样例:
输入:
4
输出:
1 1 1 1
1 1 2
1 2 1
1 3
2 1 1
2 2
3 1
4
数据范围:
前面的数越小,则字典序越小。所以1 1 1 1 小于 1 2 1 小于 2 1 1 小于 31
解题思路:
初始问题为:将 𝑛 分为若干个大于 0 的数,考虑如何进行问题转化。
当第一个数选择了 1 时,问题转为了将 𝑛−1 分为若干个大于 0 的数。
当第一个数选择了 3 时,问题转为了将 𝑛−3 分为若干个大于 0 的数。
当第一个数选择了 𝑖 时,问题转为了将 𝑛−𝑖 分为若干个大于 0 的数。
过程中,我们将每一个选择的数记录在数组中。
𝐹(𝑛) 的问题转为了 𝐹(𝑖−1),𝐹(𝑛−2)...𝐹(𝑛−𝑛) 的问题。
用一个参数变量 𝑛 ,记录当前数字的和。每次选择 𝑖=(1−>𝑛) 作为当前位置所选择的数字进行递归。
当 𝑛=0 时终止递归,输出所有已经选择的数字。