註釋:用的遞歸,不過上一道題記得超時來着,在這裏又過了,怪哉。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 }