C語言 · 數的劃分

算法訓練 數的劃分  
時間限制:1.0s   內存限制:256.0MB
      
錦囊1
使用動態規劃。
錦囊2
用F[i,j,k]表示將i劃分紅j份,最後一份爲k的方案數,則F[i,j,k]=sum F[i-k,j-1,k']。其中k'
問題描述
  將整數n分紅k份,且每份不能爲空,任意兩份不能相同(不考慮順序)。
  例如:n=7,k=3,下面三種分法被認爲是相同的。
  1,1,5; 1,5,1; 5,1,1;
  問有多少種不一樣的分法。
輸入格式
  n,k
輸出格式
  一個整數,即不一樣的分法
樣例輸入
7 3
樣例輸出
4 {四種分法爲:1,1,5;1,2,4;1,3,3;2,2,3;}
數據規模和約定
  6<n<=200,2<=k<=6

註釋:用的遞歸,不過上一道題記得超時來着,在這裏又過了,怪哉。web

 1 /*
 2 分析:遞歸問題。
 3     step表示當前剩餘的數須要分紅的份數;把n分紅k份,
 4 只需第一個數等於i,計算從i等於1一直到i等於n/k,而後
 5 把剩餘的n-i分紅k-1份的種類數.
 6     front爲剩餘的要劃分的數的前一個數,每次i從front
 7 開始一直到n/step結束,這樣才能保證獲得的劃分方式是
 8 不遞減的,才能保證不會有重複的狀況產生.
 9 */
10 #include<stdio.h> 
11 #include<string.h>
12 int ans=0;
13 void dfs(int front, int n, int step){
14     if(step==1){
15         ans++;
16         return;
17     }
18     for(int i=front; i<=n/step; i++){
19         dfs(i, n-i, step-1);//i一直是front;n-i表完成一次劃分後剩下的 
20     }
21 }
22 int main(){
23     int n,k;
24     scanf("%d%d",&n,&k);
25     /*1循環到n:表明將n劃分爲1到n的各個份數*/ 
26 //    for(int i=1;i<=n;i++){
27 //        dfs(1,n,i);
28 //    }
29     /*不循環:指定了劃分份數k*/ 
30     dfs(1,n,k);
31     printf("%d",ans);
32     return 0;
33 }
相關文章
相關標籤/搜索