自然数的拆分问题

简介: 自然数的拆分问题

题目描述

任何一个大于 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;
}

目录
相关文章
|
1月前
|
算法 C++
P2404 自然数的拆分问题(DFS)
这篇文章提供了解决自然数拆分问题的深度优先搜索(DFS)算法,包括C++实现代码,用于输出一个自然数拆分为小于等于自身且按字典序排列的所有可能序列。
|
4月前
等差素数列
等差素数列
27 0
|
4月前
|
机器学习/深度学习 算法 测试技术
【动态规划】【子数组划分】【前缀和】1977. 划分数字的方案数
【动态规划】【子数组划分】【前缀和】1977. 划分数字的方案数
|
4月前
数位拆分.
该内容描述了一个编程任务:输入一个4位正整数n(如4321),将其拆分成两个2位正整数a和b(如43和21)。文中附有两张图片示例,但因格式限制无法显示。
25 1
|
4月前
|
Java
leetcode-763:划分字母区间
leetcode-763:划分字母区间
37 0
|
11月前
|
算法
【学会动态规划】单词拆分(24)
【学会动态规划】单词拆分(24)
32 0
|
11月前
【Leetcode -205.同构字符串 -228.汇总区间】
【Leetcode -205.同构字符串 -228.汇总区间】
25 0
|
人工智能 算法 Java
LeetCode 算法 | 如何拆分数组?
LeetCode 算法 | 如何拆分数组?
|
人工智能 vr&ar
数列分块入门 1 (单点查值,区间加法)
数列分块入门 1 (单点查值,区间加法)
69 0