题目描述:将M个苹果放置到N个盘子中,可以有盘子为空,但是不分顺序,例如5个苹果分到3个盘子中,1+1+3和1+3+1视为同一种方法,求所有的方法总数。
****动态规划*****
import java.util.Scanner;
2 public class Main{
3 public static void main(String[] args)
4 {
5 /*
6 *以dp[i][j]表示i个苹果放置到j个盘子的方法数
7 *i个苹果放到j个盘子中(不分顺序)分为两种情况
8 *1.有一个盘子为空(此种情况包含多个盘子为空的状况)
9 *方法数为dp[i][j-1]
10 *2.所有盘子都不为空,则每个盘子至少有一个苹果,剩余的
11 *i-j个苹果在放置到j个盘子中,方法数为dp[i-j][j]
12 *则dp[i][j] = dp[i][j-1]+dp[i-j][j]
13 (另外要考虑当就j>i时,dp[i][j]=dp[i][i])
14 */
15 Scanner sc = new Scanner(System.in);
16 while(sc.hasNext())
17 {
18 int M = sc.nextInt();
19 int N = sc.nextInt();
20 int[][] dp = new int[M+1][N+1];
21 for(int i=1;i<=N;i++)
22 {
23 dp[1][i]=1;
24 dp[0][i]=1;
25 }
26 for(int i=1;i<=M;i++)
27 {
28 dp[i][1]=1;
29 dp[i][0]=0;
30 }
31 for(int i=2;i<=M;i++)
32 {
33 for(int j=2;j<=N;j++)
34 {
35 if(i>=j)
36 dp[i][j] = dp[i][j-1]+dp[i-j][j];
37 else
38 dp[i][j]=dp[i][i];
39 }
40 }
41 System.out.println(dp[M][N]);
42 }
43 }
44 }