题解 | #放苹果#

放苹果

http://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf

关键是 如何 寻求 大问题与 子问题之间的关系
这里就 摘抄 各位大佬的想法

大问题:m个苹果,n个 果盘,分派苹果
小问题:
1、一次分派的时候,先空出当前的果盘,不放苹果,则是苹果数量不变,果盘数 减1, dp[m][n-1];
2、一次分派的时候,每个果盘放一个苹果,剩下的m-n个苹果如何分配到 n个果盘中,子问题,dp[m-n][n]。

import java.util.*;

public class Main{
    public static void main(String[] args){
        //new Solve1().solve();
        new Solve2().solve();
    }
}

// 递归解法
class Solve1{
    public void solve(){
        Scanner in = new Scanner(System.in);
        while(in.hasNextInt()){
            System.out.println(count(in.nextInt(),in.nextInt()));
        }
        in.close();
    }
    public static int count(int m, int n){
        if(m<0 || n< 0) {
            return 0;
        }
        if(m == 1 || n== 1){
            return 1;
        }
        return count(m,n-1) + count(m-n,n);
    }
}

// 常规的动态规划解法
class Solve2{
    public void solve(){
        Scanner in = new Scanner(System.in);
        while(in.hasNextInt()){
            int m = in.nextInt(); // 苹果数量
            int n = in.nextInt(); // 果盘数量

            // 初始化
            int[][] dp = new int[m+1][n+1];
            for(int i = 0; i<= m; i++){
                dp[i][1] = 1;
                dp[i][0] = 0;
            }
            for(int i = 0; i < n+1; i++){
                dp[0][i] = 1;
                dp[1][i] = 1;
            }

            for(int i = 2; i <= m; i++){
                for(int j = 2; j <= n; j++){
                    if(i<j){ // 当 苹果数  小于 盘子数的时候
                        dp[i][j] = dp[i][j-1];
                    }else{ 
                        dp[i][j] = dp[i][j-1] + dp[i-j][j];
                    }
                }
            }
            System.out.println(dp[m][n]);
        }
    }
}
全部评论

相关推荐

vip牛牛:测试吧,开发现在至少212
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务