C++题解(37) 信息学奥赛一本通1318:【例5.3】自然数的拆分

时间限制: 1000 ms 内存限制: 65536 KB

提交数:48820 通过数: 28647

【题目描述】

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。

当n=7共14种拆分方法:

复制代码
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
total=14

【输入】

输入n。

【输出】

按字典序输出具体的方案。

【输入样例】

复制代码
7

【输出样例】

复制代码
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4

参考答案

复制代码
#include<bits/stdc++.h>
using namespace std;
int n, a[10001], ai; 

void show()
{
    cout << n << "=";
    cout << a[1];
    for(int i = 2; i <= ai; ++i)
        cout << '+' << a[i];
    cout << endl;
}

void dfs(int m, int st)
{
    for(int i = st; i <= m && i < n; ++i) 
    {
        a[++ai] = i;
        if(m - i == 0) 
            show();
        else if(m - i > 0)
            dfs(m - i, i);
        ai--;
    }
}

int main()
{
    cin >> n;
    dfs(n, 1);
    return 0;
}
相关推荐
kongdong5 分钟前
Hikyuu | RSI均值回归交易策略实现
算法·均值算法·回归·量化交易·交易策略·hikyuu
小王C语言22 分钟前
优选算法:分治-归并排序
算法
草莓熊Lotso24 分钟前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
非优秀程序员11 小时前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法
武子康17 小时前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
David猪大卫18 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger18 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
努力努力再努力wz21 小时前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化21 小时前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3