数的拆分

题目:输入整数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;
}

  

原文地址:https://www.cnblogs.com/chen-1/p/9463784.html