整数划分问题(递归策略)

下午写了一下整数划分问题,Debug了很久,老是输出得不到预期得结果,。直到将每个划分步骤保存到数组中才解决这个问题。总算通过了!so Happy! 代码如下,(懒得简化了)

/*问题描述:

// 将一个正整数n表示成一系列正整数之和,
// n = n1 + n2 + ... + nk ( 其中, n1 >= n2 >= ... >= nk , k >= 1 )
// 正整数n的一个这种表示称为正整数n的一个划分。
// 正整数n的不同的划分个数称为正整数n的划分数。

*/

  1. #include<iostream>
  2. #include<iomanip>
  3. using namespace std;
  4. static int Len=0;
  5. static int Count=0;//划分次数
  6. int main(){
  7.  void Process(int sum,int total,int b,int*Result,int Len);
  8.  const int MAX=1000;
  9.  int MP[MAX]={0};//保存划分结果
  10.  int Len=0;
  11.  int num;
  12.  cin>>num;
  13.  Process(num,0,num,MP,Len);
  14.  cout<<num<<" 的划分个数为 "<<Count<<endl;
  15.  return 0;
  16. }
  17. void Print(int *Result,int Len){
  18.  cout<<"第 "<<setw(2)<<Count<<"个划分:  ";
  19.  for(int i=0;i<Len;i++)
  20.   cout<<Result[i]<<" ";
  21.  cout<<endl;
  22. }
  23. void Process(int sum,int total,int b,int* Result,int Len){
  24.  if(total==sum){
  25.   Count++;
  26.   Print(Result,Len);//输出这个划分
  27.   return;
  28.  }
  29.  else if(total<sum){
  30.   for(int i=1;i<=b;i++){
  31.    if(total+i<=sum){
  32.     Result[Len]=i;
  33.     Process(sum,total+i,i,Result,Len+1);
  34.    }
  35.   }
  36.  }
  37. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值