整數劃分問題(遞迴策略)
阿新 • • 發佈:2019-02-02
下午寫了一下整數劃分問題,Debug了很久,老是輸出得不到預期得結果,。直到將每個劃分步驟儲存到陣列中才解決這個問題。總算通過了!so Happy! 程式碼如下,(懶得簡化了)
/*問題描述:
// 將一個正整數n表示成一系列正整數之和,
// n = n1 + n2 + ... + nk ( 其中, n1 >= n2 >= ... >= nk , k >= 1 )
// 正整數n的一個這種表示稱為正整數n的一個劃分。
// 正整數n的不同的劃分個數稱為正整數n的劃分數。
*/
- #include<iostream>
- #include<iomanip>
- usingnamespace
- staticint Len=0;
- staticint Count=0;//劃分次數
- int main(){
- void Process(int sum,int total,int b,int*Result,int Len);
- constint MAX=1000;
- int MP[MAX]={0};//儲存劃分結果
- int Len=0;
- int num;
- cin>>num;
- Process(num,0,num,MP,Len);
- cout<<num<<" 的劃分個數為 "<<Count<<endl;
- return 0;
- }
- void Print(int *Result,int Len){
- cout<<"第 "<<setw(2)<<Count<<"個劃分: ";
- for(int i=0;i<Len;i++)
- cout<<Result[i]<<" ";
- cout<<endl;
- }
- void Process(int sum,int total,int b,int* Result,int Len){
- if(total==sum){
- Count++;
- Print(Result,Len);//輸出這個劃分
- return;
- }
- elseif(total<sum){
- for(int i=1;i<=b;i++){
- if(total+i<=sum){
- Result[Len]=i;
- Process(sum,total+i,i,Result,Len+1);
- }
- }
- }
- }