动态规划之分苹果

 题目描述:将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 }
时间: 2024-10-10 04:26:44

动态规划之分苹果的相关文章

熊分苹果的问题

今天参加笔试,遇见一道编程题,给定一个1~9的整数N代表熊的数目,每只熊按照如下方式分苹果:先将苹果平均分为N份,再扔掉一个.要求输出最少的苹果总数? 思路1:逐层向下,设总数为X,则第一次每一份为(X-1)/N个苹果,第二次为((N-1)*((X-1)/N)-1)/N,依次类推.......,发现到最后由于嵌套的层数过多,已经被弄晕了,果断换方法. 思路2:(采取补苹果的方法)由题描述,因为要扔一个苹果,所以扔一个苹果==补N-1个苹果,因此第一个熊得到的苹果数为(X+N-1)/N,第二个熊得

C语言 &#183; 分苹果

算法提高 分苹果 时间限制:1.0s   内存限制:256.0MB 问题描述 小朋友排成一排,老师给他们分苹果. 小朋友从左到右标号1..N.有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li+1个小朋友每人发Ci个苹果. 最后老师想知道每个小朋友有多少苹果. 输入格式 第一行两个整数N.M,表示小朋友个数和老师个数. 接下来M行,每行三个整数Li.Ri.Ci,意义如题目表述. 输出格式 一行N个数,第i个数表示第i个小朋友手上的水果. 样例输入 5 31 2 12 3 22 5

蓝桥杯 算法训练 ALGO-121 猴子分苹果

算法训练 猴子分苹果 时间限制:1.0s   内存限制:256.0MB 问题描述 秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分.这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果.第一只猴子悄悄来到山洞,把苹果平均分成n份,把剩下的m个苹果吃了,然后藏起来一份,最后把剩下的苹果重新合在一起.这些猴子依次悄悄来到山洞,都做同样的操作,恰好每次都剩下了m个苹果.第二天,这些猴子来到山洞,把剩下的苹果分成n分,巧了,还是剩下了m个.问,原来这些猴子至少采了多少个苹果. 输入格式 两个整数

分苹果

题目: 穷举法:由于3 1 1和1 3 1 是一种分法,所以也就是说在N个篮子里的苹果数目是 n1<=n2<=......<=nn.所以只要进行N次循环,假设上层循环标量是i,则下层循环时j=i. 由于事先N,即篮子的数目是不确定的,所以只能使用递归来确定循环层数. 1 #include<iostream> 2 using namespace std; 3 int count; 4 int foo(int n,int m,int prei,int temp[10]) 5 {

COJN 0583 800602分苹果

800602分苹果 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 第一行是测试数据的数目t,以下每行均包含二个整数M和N,以空格分开. 输出 对输入的每组数据M和N,用一行输出相应的K. 输入示例 17 3 输出示例 8 其他说明 数据范围:0<=t<=20,1<=M,N&l

[华为机试真题]70.分苹果

题目 M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放. 1<=M<=10,1<=N<=10 例如5个苹果三个篮子,3,1,1 和 1,1,3是同一种放法 输入 7 3 输出 8 思路 设f(m,n) 为m个苹果,n个盘子的放法数目: 当n>m:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响.即if(n>m) f(m,n) = f(m,m) 当n<=m:不同的放法可以分成两类: (1)有至少一个盘子空着,即相当于f(m,n) = f(m

算法历练之路——分苹果

分苹果 时间限制: 1Sec 内存限制: 128MB 提交: 231 解决: 69 题目描述小朋友排成一排,老师给他们分苹果. 小朋友从左到右标号1..N.有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li+1个小朋友每人发Ci个苹果. 最后老师想知道每个小朋友有多少苹果. 数据规模和约定 100%的数据,N.M≤100 000,1≤Li≤Ri≤N,0≤Ci≤100. 输入第一行两个整数N.M,表示小朋友个数和老师个数. 接下来M行,每行三个整数Li.Ri.Ci,意义如题目表述.输

动态规划之收集苹果

路径经过的最大值(最小值):原题:平面上有N*M个格子,每个格子中放着一定数量的苹果.从左上角的格子开始, 每一步只能向下走或是向右走,每次走到一个格子就把格子里的苹果收集起来, 这样一直走到右下角,问最多能收集到多少个苹果. 不妨用一个表格来表示: {5, 8, 5, 7, 1, 8},    {1, 3, 2, 8, 7, 9},    {7, 8, 6, 6, 8, 7},    {9, 9, 8, 1, 6, 3},    {2, 4,10, 2, 6, 2},    {5, 5, 2,

分苹果问题的C++和Python实现

很好玩的一个问题.话说小明的苹果怎么可能一模一样? 显然这并不是重点.重点在于抽象这个问题的方法. 如果从M个苹果,拿出N个苹果,问有几种可能性,很明显这是典型的组合问题: combination algabra; 如果把M个苹果等分成N份.显然只有1种可能. 把苹果分成N堆,求可能性,我一时半会想不出什么数学模型.自然而然,想到了数学方法:迭代逼近和递归. 题目额外说明,1,3,1 和1,1,3算同一种分法.其分发可能等价于将苹果递减或者递增排列. 于是我们开始递归计数: 递归操作:遍历M~0