题目描述如下

一个整数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即保证有一位数时也进行递归。

最后修改:2019 年 04 月 20 日
如果觉得我的文章对你有用,请随意赞赏