题目描述如下
一个整数n(n<=10)可以有多种分划,使其分划的一列整数之和为n。
输入
输入只有一个整数n<=10
输出
有多行,列出所有的划分,每行为一种划分,按字典逆序输出,详细见Sample Output。
注意:相临的两个数之间用两个空格分割。
样例输入
6
样例输出
6
5 1
4 2
4 1 1
3 3
3 2 1
3 1 1 1
2 2 2
2 2 1 1
2 1 1 1 1
1 1 1 1 1 1
解法如下:
#include <iostream>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
using namespace std;
void solve(int num[], int n, int r)
{
if (n == 0)
{
for (int i = 0; i <= r - 1; i++)
{
if (i == 0)
{
cout << num[i];
}
else
{
cout << " " << num[i] ;
}
}
cout << endl;
}
else
{
for (int i = n; i >= 1; i--)
{
if (i <= num[r - 1] || r == 0) //保证前面一位大于后面一位,或者只有一位数
{
num[r] = i;
solve(num, n - i, r + 1);
}
}
}
}
int main()
{
int num[100];
int n;
cin >> n;
solve(num, n, 0);
system("pause");
return 0;
}
用递归的思想,每次完成一种就输出,然后能分解的就继续分解,注意!!必须要保证前面一位大于后面一位
void solve(int num[], int n, int r)
这个函数中,num是存数据的数组,n是代表当前的数,r代表位数
for (int i = n; i >= 1; i--)
{
if (i <= num[r - 1] || r == 0) //保证前面一位大于后面一位,或者只有一位数
{
num[r] = i;
solve(num, n - i, r + 1);
}
}
这个for循环,i从输入的n开始,到1结束, i <= num[r - 1] 就是保证前面一位大于后面一位的。r==0即保证有一位数时也进行递归。