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;
}
相关推荐
weixin_424183616 小时前
开放—封闭原则实战(下):基于策略的流程编排与编译期多态
c++·分布式·系统架构
wuminyu6 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
小蒋学算法6 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法
m0_380743877 小时前
C++中的freopen的用法实例详解
开发语言·c++
荆棘鸟智能7 小时前
林业遥感长势评估怎么做?从NDVI时序分析到LiDAR蓄积量回归
人工智能·算法·智慧林业
jimy17 小时前
polymorph.cpp里面的“析构函数、智能指针”问题
开发语言·c++
hhb_6188 小时前
AIRAGDebug:一键定位RAG链路异常
人工智能·python·算法
朝朝辞暮i8 小时前
C++ 第 6 课:switch —— 多状态选择
开发语言·c++·算法
朝朝辞暮i8 小时前
C++ 第 4 课:if / else —— 让程序自己做决定
开发语言·c++
苏打豆8 小时前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人