標籤:
F - 小晴天老師系列——蘋果大豐收Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)Submit StatusProblem Description
小晴天的後花園有好多好多的蘋果樹,某天,蘋果大豐收~小晴天總共摘了M個蘋果,我們假設蘋果之間是不可分辨的。
為了儲存蘋果,小晴天買了N個一模一樣的箱子,想要把蘋果放進去,允許有的箱子是空的,請問小晴天有多少種不同的放法呢?
例如對於4個蘋果,3個箱子,2+1+1和1+2+1和1+1+2 是同一種分法。
Input
多組資料,首先是一個正整數t(t<=100)表示資料的組數。
每組資料均包含二個整數M和N(1<=M,N<=10)。
Output對於每組資料,輸出一個整數,表示不同的放法數。Sample Input
17 3
Sample Output
8
Hint
對於7個蘋果,3個箱子
有7+0+0=6+1+0=5+2+0=4+3+0=5+1+1=4+2+1=3+2+2=3+3+1
這8种放法。
思路:這以前做過的一題一樣,不過這是暴力專題,就用暴力的方法過了。。。
按照每次放的方式,從多到少一次放蘋果,
比如7 3,的話就是 :
7 0 0
6 1 0
5 2 0
5 1 1
4 3 0
4 2 1
3 3 1
3 2 2
是不是發現了什麼規律哈,從左邊到右邊依次遞減,而且總和會等於M,且數的個數不能夠超過N,所暴力解決:
1 #include <iostream> 2 #include <stdio.h> 3 using namespace std; 4 int M,N; 5 int SUM; 6 void BFS(int sum,int j,int Num)/*BFS(i,j,k),i表示當前數的總和,*/ 7 { /*j標記第幾個數,k表示當前的數*/ 8 int i; 9 if(j<=N&&sum==M){SUM++;return ;}/*總和等於M且數的個數小於N為一種方法*/10 for(i=Num;i>0;i--)/*每一次取的數都要小於或者等於當前的數*/11 {12 if(sum+i<=M)/*判斷是否超出總和*/13 {14 BFS(sum+i,j+1,i);15 }16 }17 }18 int main()19 {20 int i,T;21 scanf("%d",&T);22 while(T--)23 {24 scanf("%d%d",&M,&N);25 SUM=0;26 for(i=M;i*N>=M;i--)27 {28 BFS(i,1,i); 29 }30 printf("%d\n",SUM);31 }32 return 0;33 }View Code
以前的一題目放蘋果:http://www.cnblogs.com/LWF5201314614/p/3750313.html
F - 小晴天老師系列——蘋果大豐收