java实现放苹果(摆放类题目)
来源:互联网 发布:淘宝食品特种经营资质 编辑:程序博客网 时间:2024/05/15 02:11
题目描述
题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
每个用例包含二个整数M和N。0<=m<=10,1<=n<=10。
样例输入
7 3
样例输出
8
/**
* 计算放苹果方法数目
* 输入值非法时返回-1
* 1 <= m,n <= 10
* @param m 苹果数目
* @param n 盘子数目数
* @return 放置方法总数
*
*/
public static int count(int m, int n)
输入描述:
输入两个int整数
输出描述:
输出结果,int型
输入例子:
7 3
输出例子:
8
这类题目我的死穴啊~ 今天就来好好学习一下,到底应该怎么解决这种问题。
首先分析:
7个苹果3个盘子,可能的摆放方法有:
(7,0,0),
(6,1,0),
(5,2,0),(5,1,1),
(4,3,0),(4,2,1),
(3,3,1),(3,2,2),共8种;
因为允许盘子有空的,所以这个题的思维方式应该是:
放苹果分为两种情况,一种是有盘子为空,一种是每个盘子上都有苹果。
令(m,n)表示将m个苹果放入n个盘子中的摆放方法总数。
1.假设有一个盘子为空,则(m,n)问题转化为将m个苹果放在n-1个盘子上,即求得(m,n-1)即可
2.假设所有盘子都装有苹果,则每个盘子上至少有一个苹果,即最多剩下m-n个苹果,问题转化为将m-n个苹果放到n个盘子上
即求(m-n,n)
综上所述:
(m,n)=(m,n-1)+(m-n,n);
再看看我的代码:
public static int count(int m,int n){ if(m>=1&&n==1){ return 1; } int result=0; if(m>=n){ result=m-n+count(m-n,n-1); } else{ result=count(m,m); } return result; }其实想法已经很接近了,但是还是没有想到这个递推的公式:
(m,n)=(m,n-1)+(m-n,n);
其实,当n>m的时候,n-m个盘子一定是空的,所以它们不会对摆放苹果产生影响。
而出口的条件一定是 n==1 的时候,return 1;
正确的AC代码:
import java.util.*; 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(); if(m<1 || n>10){ System.out.println(-1); }else{ System.out.println(shareCount(m,n)); } } } public static int shareCount(int m, int n){ if(m<0){ return 0; } if(m==1 || n==1){ return 1; } return shareCount(m, n-1)+shareCount(m-n,n); }}
阅读全文
0 0
- java实现放苹果(摆放类题目)
- poj 1664 放苹果(中文题目)
- POJ 题目1664 放苹果(递归)
- 题目1160:放苹果
- 题目1160:放苹果
- 题目1160:放苹果
- 题目1160:放苹果
- 放苹果,递归,Java
- 九度 oj 题目1160:放苹果
- 放苹果(递归)
- 放苹果(递归)
- 【放苹果(题解)】
- 放苹果(递归)
- poj1664 放苹果(递归)
- poj1664 放苹果(递归)
- 华为OJ(放苹果)
- POJ-放苹果(DP)
- POJ1664 放苹果(递归)
- 第三步优化
- Sqlite微型数据库
- js入门例子
- 使用列表写导航栏
- 套接字编程(三)----多进程
- java实现放苹果(摆放类题目)
- C语言宏定义函数
- [windows]远程桌面用户管理
- 文字在底部显示
- OpenCV中的Haar+Adaboost(三):级联分类器结构与XML文件含义
- CSS clip 属性
- 【opencv】神经网络识别字母+数字
- TCP的转载机
- Maven学习(三)