1077. 自然数的拆分问题

题目描述

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。拆分成的数字相同但顺序不同被看做是相同的方案,如果1+3与3+1被看做是同一种方案。

输入

输入待拆分的自然数n。

输出

如样例输出若干个拆分方案(具体见样例)。

样例输入

7

样例输出

1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,total=0;
int a[10001]={1};

int print(int t)
{
   total++;
//   cout<<n<<"=";
   for(int i=1;i<=t;i++)
   {
       if(i==t)
       {
           cout<<a[i];
           cout<<endl;
       }
      else  cout<<a[i]<<"+";
   }
}

int search(int s,int t)
{
    int i;
    for(i=a[t-1];i<=s;i++)
    if(i<n)                //当前数i要大于等于前1位数,且不过n
    {
        a[t]=i;            //保存当前拆分的数i
        s-=i;              //s减去i,s的值继续拆分
        if(s==0) print(t);  //s==0  拆分结束输出结果
        else search(s,t+1); //s>0,继续递归
        s+=i;               //回溯:加上拆分的数,以便产分所有可能的拆分
    }
    return 0;
}
int main()
{
   cin>>n;
   search(n,1);        //将要拆分的数n传递给s
   
//   cout<<total<<endl;       //这是总方案数
   return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_19656301/article/details/82794790