zoukankan      html  css  js  c++  java
  • 数的拆分

    题目:输入整数n,输出n的拆分方案,即n=S1+S2+S3+S4+S5......+Sk,且Sn<=S(n+abs(i))啊,按字典序输出。

    数据输入:

    一行一个整数n,1<=n<=20

    数据输出:

    所有拆分方案(见样例)

    输入:

    4

    输出:

    1+1+1+1

    1+1+2

    1+3

    2+2

    4

    total=5

    题解:

    五的拆分如下

    1+1+1+1+1

    1+1+1+2

    1+2+2

    1+4

    5

    可以发现有 "___"的部分是4的拆分

    可以枚举一个i,拆分i和n-i,完成搜索,定义数组num表示拆分出来的数,定义变量surplus表示剩余的值(num[idx-1]<=i<=surplus)

    完整代码如下:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int num[21];
    int n,ans;
    void print(int x)//输出函数
    {
            ans++;//总数加一
            for(int i=1;i<=x-1;i++) printf("%d+",num[i]);
            printf("%d
    ",num[x]);
    } 
    void dfs(int idx,int surplus)
    {
        if(surplus==0)//当剩余值为0时,输出
        {
            if(idx>1) print(idx-1);
        }
        else for(int i=num[idx-1];i<=surplus;i++)//否则枚举i
        {
            num[idx]=i;//赋值
            dfs(idx+1,surplus-i);//深搜
        }
    }
    int main()
    {
        int n;
        scanf("%d",&n);//读入
        num[0]=1;
        dfs(1,n);
        printf("total=%d",ans);//输出总数
        return 0;
    }
    

      

  • 相关阅读:
    复习列表
    20201009 day30 复习2:滑动窗口
    20201009 day30 复习1:扫描线
    20201007day29 模拟(九)
    20201006day28 模拟(八)
    20201005day27 模拟(七)
    20201004 day26 模拟(六)
    20201003day25 模拟(五)
    路由重分布(一)
    RIP路由协议(一)
  • 原文地址:https://www.cnblogs.com/chen-1/p/9463784.html
Copyright © 2011-2022 走看看