P2404 自然数的拆分问题题解

题目传送门

#include <bits/stdc++.h>

using namespace std;
//哪个数字
int n;
//全局路径(需要回溯)
vector<int> path;

//输出
void print() {
    //划分成两部分,最后一部分不在尾巴上加+号!
    for (int i = 0; i < path.size() - 1; i++) cout << path[i] << "+";
    cout << path[path.size() - 1] << endl;
}

//深度优先搜索
void dfs(int x, int sum) {
    //终止条件
    if (path.size() > 1 && n == sum) {//需要把一个数字描述成2个及2个以上数字的和,
        // 自已描述自己不行,就是path.size()>1
        print();
        return;
    }
    //本轮添加上什么样的数字:可以是1,2,3,...,n
    for (int i = 1; i <= x; i++) {
        //1、路径空的时候可以放
        //2、路径不空,同时,当前要加入的数字比尾巴上的数字要大,也可以放
        if (path.empty() || i >= path[path.size() - 1]) {
            //加入
            path.push_back(i);
            //递归
            dfs(x - i, sum + i);
            //回溯
            path.pop_back();
        }
    }
}

int main() {
    //输入
    cin >> n;
    //深度优先搜索
    dfs(n, 0);
    return 0;
}




原文地址:https://www.cnblogs.com/littlehb/p/15069672.html