DFS之整数拆分

题目描述

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和,求拆分的方案总数和具体的拆分方式。

输入格式     一个整数n

输出格式     一个整数表示方案数,接下来若干行表示方案

样例数据

Input

4

Output

4

n<=暴力一定让你过的数

时间限制:1s

空间限制:256MB

我们用一个暴力搜索的方法将这个数一个个拆分,再计总个数,输出。

如果当那个被拆分的数n变为零且这个拆分出来的数不是本身的时候,说明出现了一种正确的答案,就把总数加一,然后退出这层递归,去模拟下一种拆分方法。如果出现了负数,也就是说这种拆分方法是不行的,也就退出这层递归,继续模拟寻找另一种可行的拆分方法。

我们要将每一个拆出来的数到一个a数组当中储存下来,每次要拆的数都要从这个数的基础上向当前的拆分后所余下的数这个区间范围内选择,这是为了保证拆出来的方案不会有重复。


  代码:

#include <bits/stdc++.h>

int sum=1,n,m,i,j;

int a[1000];

void f(int k,int x) 

{

    inti;

    if(x==0 && k-1>1)  //判断这个拆分是否成立

    {

       sum++;

       exit;

    }

    for(i=a[k-1];i<=x;i++)  //区间范围循环选择拆分的数

    {

       a[k]=i;

       f(k+1,x-i);  //递归

    }

}

using namespace std;

int main()

{

    cin>>n;

    a[0]=1;

    f(1,n);  //DFS

    cout<<sum;

    return0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值