放苹果
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 |
思路:dp[i][j]表示i个苹果,j个盘子的放的方案数,则有dp[i][j] = dp[i][j-1] + dp[i-j][j],dp[i][j-1]表示不是所有的盘子都放有苹果,dp[i-j][j],表示所有的盘子中都放入了苹果,这个前提是i>=j。i<j时,dp[i][j] = dp[i][i]。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int dp[15][15]; 6 int main(){ 7 int n, m, t; 8 for(int i = 0;i <= 10;i ++) dp[0][i] = dp[1][i+1] = 1; 9 for(int i = 0;i <= 10;i ++){ 10 for(int j = 1;j <= 10;j ++){ 11 if(i < j) dp[i][j] = dp[i][i]; 12 else dp[i][j] = dp[i][j-1] + dp[i-j][j]; 13 } 14 } 15 /* freopen("in.c", "r", stdin); */ 16 scanf("%d", &t); 17 while(t--){ 18 scanf("%d%d", &n, &m); 19 printf("%d\n", dp[n][m]); 20 } 21 return 0; 22 }
Python 代码:
1 def fun(n, m): 2 if n < 0: 3 return 0 4 if n == 0 or n == 1 or m == 1: 5 return 1 6 if n < m: 7 return fun(n, n) 8 if n >= m: 9 return fun(n, m-1) + fun(n-m, m) 10 n = int(raw_input()) 11 m = int(raw_input()) 12 print fun(n, m)