题目:
将 𝑛 分成 𝑚 个大于 0 的不同数的和, 1 2 同 2 1 视作相同的划分。
按照字典序输出所有方案。数据保证存在解,即不会出现 1+2+⋯𝑚>𝑛 的情况
输入数据:
2 个数 𝑛 , 𝑚 ( 1≤𝑚≤10 , 1≤𝑛≤50 )。
1+2+⋯𝑚>𝑛
输出数据:
按照字典序,输出所有方案。数字之间,用空格划分。
数据范围:
对于 100% 的数据, 1≤𝑚≤10 , 1≤𝑛≤50 。
样例:
输入:
13 3
输出:
1 2 10
1 3 9
1 4 8
1 5 7
2 3 8
2 4 7
2 5 6
3 4 6
数据范围:
题目要求数都不同,因此只有以上这些种划分方法。
解题思路:
套用分数字 𝑉2 的模板,只对递归的终止条件进行修改。当选择的数字数量为 𝑚 时进行判断:
如果加和 𝑛=0 则输出答案,否则不做任何处理。完成这部分工作后,退出递归。
代码:
#include<bits/stdc++.h>
using namespace std;
int nums[51], m;
void Dfs(int n, int min, int index) {
if (index == m) {
if (n == 0) {
for (int i = 0; i < index; i++)
cout << nums[i] << " ";
cout << endl;
return;
}
}
for (int i = min; i <= n; i++) {
nums[index] = i;
Dfs(n - i, i + 1, index + 1);
}
}
int main() {
int n;
cin >> n >> m;
Dfs(n, 1, 0);
return 0;
}
注:本文来源于51NOD,为@小罐头甜编辑