• 【例5.3】自然数的拆分


    【例5.3】自然数的拆分

    链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1318


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

    【题目描述】

    任何一个大于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<iostream>
    #include<cstdio>
    #include<string>
    #include<cmath>
    #include<iomanip>
    using namespace std;
    int a[25];
    int N;
    void search(int n,int w){//拆分n,拆分成w个数
            if(a[w-1]>n)return;
            for(int i=a[w-1];i<=n;i++)
            {
                n-=i;
                a[w]=i;
                if(!n&&i!=N)
                {
                    printf("%d=",N);
                    for(int j=1;j<w;j++)
                        printf("%d+",a[j]);
                    cout<<i<<endl;
                    return;
                }
                else search(n,w+1);
                n+=i;//回溯
            }    
    
    }
    int main()
    {
        a[0]=1;
        cin>>N;
        int n=N;
        search(n,1);
        
    }

     法2:分的前一个数要小于后一个数,所以分的数要<=原数一半,但还有一种情况,直接分完,对此情况要考虑不能原数=原数

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int a[1005];
    int N,ans;
    void print(int k)
    {
        
        printf("%d=",N);
        for(int i=1;i<k;i++)
            printf("%d+",a[i]);
        printf("%d
    ",a[k]);
    }
    void dfs(int n,int k)
    {
        if(!n){
            print(k-1);return;
        }
        for(int i=a[k-1];i<=n/2;i++)
        {
            a[k]=i;
            dfs(n-i,k+1);
        }
        a[k]=n;dfs(0,k+1);
    }
    int main()
    {
        int n;
        cin>>n;
        N=n;
        for(int i=1;i<=n/2;i++)
            {
                a[1]=i;
                dfs(n-i,2);
            }
        
    }
  • 相关阅读:
    H3C无线配置2三层注册典型配置举例(集中转发)
    PHP 中 exec() 执行系统外部命令
    salesforce 从零开始(一)开始使用
    求和平均统计
    VS2012 如何进行远程调试
    H5跳转小程序的方法
    C#提取HTML中IMG标签的URL
    数据库链接字符串中的细节(integrated security=true;MultipleActiveResultSets=true)
    运行cmd状态下MySQL导入导出.sql文件
    sql server 2008 rownumber 分页sql语句
  • 原文地址:https://www.cnblogs.com/EdSheeran/p/7531931.html
Copyright © 2020-2023  润新知