Java语言
问题:将m个苹果放入n个盘子的方法数
方法一:动态规划(与递归思想其实都是一样的)
状态转移式:
dp[m][n]=dp[m][n-1]+dp[m-n][n]
其中:
dp[m][n]:将将m个苹果放入n个盘子的方法数(分为以下两种情况—————有盘子是空的,没有盘子是空的)
dp[m][n-1]:将m个苹果放入n-1个盘子中的方法数(要求至少有一个盘子是空的的情况,虽然在这个表达式里看起来好像是只有一个盘子是空的,但实际上继续算下去,别的盘子也可以是空的,可以自己举个例子就明白了,总体是至少有一个盘子是空的的情况)
dp[m-n][n]:将m-n个苹果放入n个盘子中的方法数(没有盘子是空的,所以每个盘子都放了一个,只剩m-n个苹果了,要放进n个盘子里)

import java.util.Scanner;

public class Main {
   public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int m=sc.nextInt();
            int n=sc.nextInt();
            int dp[][]=new int[m+1][n+1];
            for(int i=0;i<=m;i++){//不然dp[0][2]填不进去啊
                for(int j=1;j<=n;j++){
                                //j=1,放进一个盘子里只有一种方法;i<=1举例推得要为1
                    if(j==1||i<=1){
                        dp[i][j]=1;
                    }
                    else{
                        if(i>=j){//等于的时候算这里
                            dp[i][j]=dp[i][j-1]+dp[i-j][j];
                        }
                        else{
                            dp[i][j]=dp[i][i];
                        }
                    }
                }
            }
            System.out.println(dp[m][n]);
        }
    }

方法二:递推
一个道理

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        Main apple=new Main();
        while(sc.hasNext()){
            int m=sc.nextInt();
            int n=sc.nextInt();
            int s=apple.numberWays(m,n);
            System.out.println(s);
        }
    }
    public int numberWays(int m,int n){
        int num;
        if(m<=1||n==1){
            return 1;
        }
        if(m>=n){
            num=numberWays(m,n-1)+numberWays(m-n,n);
        }
        else{
            num=numberWays(m,m);
        }
        return num;
    }
}