自然数的拆分问题

简介: 自然数的拆分问题

题目描述

任何一个大于 1的自然数 n,总可以拆分成若干个小于 n 的自然数之和。现在给你一个自然数 n,要求你求出 n 的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。

输入格式

输入:待拆分的自然数 n。

输出格式

输出:若干数的加法式子。

输入输出样例

输入

7


输出

1+1+1+1+1+1+1

1+1+1+1+1+2

1+1+1+1+3

1+1+1+2+2

1+1+1+4

1+1+2+3

1+1+5

1+2+2+2

1+2+4

1+3+3

1+6

2+2+3

2+5

3+4

说明/提示

数据保证,2≤n≤8。

#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
void dfs(int n, int start, vector<int>& path) {
    if (n == 0) {
        for (int i = 0; i < path.size(); i++) {
            cout << path[i];
            if (i != path.size() - 1) {
                cout << "+";
            }
        }
        cout << endl;
        return ;
    }
    for (int i = start; i <= n; ++i) {
        path.push_back(i);
        dfs(n - i, i, path);
        path.pop_back();
    }
}
int main() {
    int n;
    cin >> n;
    vector<int> path;
    dfs(n, 1, path);
    return 0;
}

这个代码运行后会输出n的数值,与题目要求不符,改进后代码如下:

#include<iostream>
using namespace std;
class Solution {
public:
    int n, a[10];
    void dfs(int h, int c, int q) {
        if (h == n) {
            for (int i = 1; i <= c - 2; i++) {
                cout << a[i] << '+';
            }
            cout << a[c - 1] << endl;
            return;
        }
        if (h > n) return;
        for (int i = q; i <= n - 1; i++) {
            a[c] = i;
            dfs(h + i, c + 1, i);
            a[c] = 0;
        }
    }
};
int main() {
    Solution solution;
    cin >> solution.n;
    solution.dfs(0, 1, 1);
    return 0;
}

目录
相关文章
|
6月前
|
Java C++
leetcode-139:单词拆分
leetcode-139:单词拆分
64 0
|
3月前
|
算法 C++
P2404 自然数的拆分问题(DFS)
这篇文章提供了解决自然数拆分问题的深度优先搜索(DFS)算法,包括C++实现代码,用于输出一个自然数拆分为小于等于自身且按字典序排列的所有可能序列。
|
6月前
等差素数列
等差素数列
33 0
|
6月前
数位拆分.
该内容描述了一个编程任务:输入一个4位正整数n(如4321),将其拆分成两个2位正整数a和b(如43和21)。文中附有两张图片示例,但因格式限制无法显示。
58 1
|
6月前
|
自然语言处理
leetcode-140:单词拆分 II
leetcode-140:单词拆分 II
45 0
|
6月前
|
人工智能 BI
leetcod-561:数组拆分 I
leetcod-561:数组拆分 I
47 0
|
算法
【学会动态规划】单词拆分(24)
【学会动态规划】单词拆分(24)
44 0
|
算法 Java C++
leetcode单词拆分
leetcode单词拆分
|
人工智能 vr&ar
数列分块入门 1 (单点查值,区间加法)
数列分块入门 1 (单点查值,区间加法)
80 0