洛谷题单指南-搜索-P2404 自然数的拆分问题

原题链接:https://www.luogu.com.cn/problem/P2404

题意解读:将整数拆成若干数相加,按字母序输出,可以转换成从小到大往数组填数的问题,直到填的数之和等于n。

解题思路:

通过DFS,每次填一个数,填数时从1~n-1逐个填

注意两个条件不能继续DFS:

1、将填的数之和超过n

2、将填的数小于上一次填的数

100分代码:

#include <bits/stdc++.h>
using namespace std;

int n;

int a[10];

void dfs(int k, int sum)
{
    if(sum == n) //如果已填的数和为n
    {
        for(int i = 1; i < k; i++)
        {
            if(i > 1) cout << "+";
            cout << a[i];
        } 
        cout << endl;
    }
    for(int i = 1; i < n; i++)
    {
        if(sum + i > n) break; //如果加起来超过n
        if(i < a[k - 1]) continue; //如果填的数比前面的小,不符合顺序

        a[k] = i; //第k个数填i
        dfs(k + 1, sum + i);
    }
}

int main()
{
    cin >> n;
    dfs(1, 0);
    return 0;
}

 

posted @ 2024-03-07 17:58  五月江城  阅读(23)  评论(0编辑  收藏  举报