POJ1664 放苹果 (DFS)

Description

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

Input

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

Output

对输入的每组数据M和N,用一行输出相应的K。

Sample Input

1
7 3

Sample Output

8
 
其实这道题如果你有这个耐心的话,自己在纸上列举出所有状态结果也是可行的,但这样做就不符合我们ACM的风格了
这道题可以采取递归的思想,分为两种状况,n为苹果数,m为盘子数
第一:当n<m时,那么就是将n个苹果分到n个盘的方法
第二:n>=m时,那么1.将至少其中一个盘不放,那么就是n个苹果放到m-1个盘的方法
                2.每个盘放一个,然后就是n-m个放在m个盘的放法

 1 #include <stdio.h>  
 2 #include <string.h>  
 3 #include <algorithm>  
 4 using namespace std;  
 5   
 6 int solve(int n,int m)  
 7 {  
 8     if(n == 1 || m == 1 || n == 0)  
 9     return 1;  
10     if(n<m)  
11     return solve(n,n);  
12     else  
13     return solve(n,m-1)+solve(n-m,m);  
14 }  
15   
16 int main()  
17 {  
18     int t,n,m;  
19     scanf("%d",&t);  
20     while(t--)  
21     {  
22         scanf("%d%d",&n,&m);  
23         printf("%d\n",solve(n,m));  
24     }  
25   
26     return 0;  
27 }  
View Code

 

 

posted @ 2017-03-13 17:39  vxee  阅读(115)  评论(0编辑  收藏  举报