洛谷 P2404 自然数的拆分问题(dfs)

    科技2022-08-15  96

    P2404 自然数的拆分问题

    时间限制 1.00s 内存限制 125.00MB

    题目描述

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

    输入格式

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

    输出格式

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

    输入输出样例 输入 #1

    7

    输出 #1

    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

    说明/提示 用回溯做。。。。

    n≤8

    处理思路: 算法:深搜。 参数:sign,sum,start。

    sign标记当前需要处理的位置。sum处理完位置后的累加值。start题目要求字典序排列且无重复,继承前位置值,后位置值此基础上叠加。 若不定义start,显示字典序,有重复(仅位置改变)序列。 //sign 标记当前位置 //sum 当前累加值 //start 升序初始值 #include<bits/stdc++.h> using namespace std; int a[10], n; void dfs (int sign, int sum, int start) { if (sum == n) { for (int i = 1; i < sign-1; i++) printf("%d+", a[i]); printf("%d\n", a[sign-1]); return; } if (sum > n) return; for (int i = start; i < n; i++) { a[sign] = i; dfs(sign+1, sum+i, i); a[sign] = 0; } return; } int main () { scanf("%d", &n); dfs(1, 0, 1); return 0; }
    Processed: 0.025, SQL: 8