1318:自然数的拆分

【题目描述】

任何一个大于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
// Created on 2020/2/4

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <climits>
//#include <bits/stdc++.h>
#define A 500+5

using namespace std;

//int i,j,k;

const int maxn=INT_MAX;

const int idata=2000+5;
int a[idata];
bool judge[idata];
int cnt;
int n;

inline void print(int t)
{
    cout<<n<<"=";
    for(register int i=1;i<=t-1;i++)
    {
        cout<<a[i]<<"+";
    }
    cout<<a[t]<<endl;
    //memset(a,0,sizeof(a));
}

inline void dfs(int y,int x)
{
    for(register int i=a[x-1];i<=y;i++)//使当前数大于等于存入数组的前一个数
    {
        if(i<n)
        {
            y-=i;

            a[x]=i;
            if(y==0) print(x);
            else dfs(y,x+1);

            y+=i;  //回溯:产生所有拆分
        }
    }
}

int main()
{
    cin>>n;
    a[0]=1;
    dfs(n,1);

    return 0;
}
发布了156 篇原创文章 · 获赞 8 · 访问量 3877

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/104176534