1. 程式人生 > >整數劃分問題(遞迴策略)

整數劃分問題(遞迴策略)

下午寫了一下整數劃分問題,Debug了很久,老是輸出得不到預期得結果,。直到將每個劃分步驟儲存到陣列中才解決這個問題。總算通過了!so Happy! 程式碼如下,(懶得簡化了)

/*問題描述:

// 將一個正整數n表示成一系列正整數之和,
// n = n1 + n2 + ... + nk ( 其中, n1 >= n2 >= ... >= nk , k >= 1 )
// 正整數n的一個這種表示稱為正整數n的一個劃分。
// 正整數n的不同的劃分個數稱為正整數n的劃分數。

*/

  1. #include<iostream>
  2. #include<iomanip>
  3. usingnamespace
     std;
  4. staticint Len=0;
  5. staticint Count=0;//劃分次數
  6. int main(){
  7. void Process(int sum,int total,int b,int*Result,int Len);
  8. constint 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. elseif(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. }