POJ --- 1164 放苹果

  

                                放苹果

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 24947   Accepted: 15887

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
", 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)
原文地址:https://www.cnblogs.com/anhuizhiye/p/3628905.html