C語言 · 數的劃分

算法提升 數的劃分  
時間限制:1.0s   內存限制:256.0MB
    
問題描述
  一個正整數能夠劃分爲多個正整數的和,好比n=3時:
  3;1+2;1+1+1;
  共有三種劃分方法。
  給出一個正整數,問有多少種劃分方法。
輸入格式
  一個正整數n
輸出格式
  一個正整數,表示劃分方案數
樣例輸入
3
樣例輸出
3
數據規模和約定
  n<=100
 
做者註釋: 遞歸問題。(本題運行超時)

  step表示當前剩餘的數須要分紅的份數;把n分紅k份,
只需第一個數等於i,計算從i等於1一直到i等於n/k,而後
把剩餘的n-i分紅k-1份的種類數.
  front爲剩餘的要劃分的數的前一個數,每次i從front
開始一直到n/step結束,這樣才能保證獲得的劃分方式是
不遞減的,才能保證不會有重複的狀況產生.算法

 1 #include<stdio.h> 
 2 #include<string.h>
 3 int ans=0;
 4 void dfs(int front, int n, int step){
 5     if(step==1){
 6         ans++;
 7         return;
 8     }
 9     for(int i=front; i<=n/step; i++){
10         dfs(i, n-i, step-1);
11     }
12 }
13 int main(){
14     int n;
15     scanf("%d",&n);
16     for(int i=1;i<=n;i++){
17         dfs(1,n,i);
18     }
19     printf("%d",ans);
20     return 0;
21 }
相關文章
相關標籤/搜索