这是无意中在一个录音中听到的一个题目:一张很大很大的饼,给你一把足够长的刀,切n刀,最多可以得多少块?
这个问题听起来很简单,还是用程序记录一下吧。
解题:一刀都不切,有1块饼;
切第一刀,得2块饼;
切第二刀,这一刀跟原来那一刀有一个交点,把两块再分出两块,2+2=4;
切第三刀,为了得到更多,要让这一刀跟原来两刀都有交点,4+3=7;
切第四刀,为了得到更多,要让每一刀都跟之前得刀尽量都有交点,7+4=11;
....
切第n刀,f(n-1) + n;
代码如下:
package com.jandmin.demo.leetcode;
/**
* @description: 切大饼最大切法
* 一张大饼切n刀,最多可以切多少块?
* @author: JandMin
* @create: 2019-06-14 09:06
**/
public class CutThePie {
public static void main(String[] args) {
for(int i=0; i<11; i++){
int total = cutPie(i);
print("方式一",i,total);
int num = 1;
for(int j = 0; j<=i; j++){
num = cutPie(num,j);
if(j == i){
print("方式二",i,num);
break;
}
}
}
}
/**
* @Description: 打印
* @Date: 2019/6/14
* @param name
* @param n
* @param total
* @return: void
*/
private static void print(String name,int n,int total){
System.out.println(name + "切 " + n + " 刀最多得到 " + total + " 块饼");
}
/**
* @Description: 方式一:一次性切大饼
* @Date: 2019/6/14
* @param knife 切得刀数量
* @return: int 得到得答饼块数量
*/
private static int cutPie(int knife) {
if(knife <= 0){
return 1;
}
return cutPie(knife-1) + knife;
}
/**
* @Description: 方式二:切大饼切一刀
* @Date: 2019/6/14
* @param before 切之前得大饼块数
* @param knife 切的第第几刀
* @return: int 当前切完的大饼块数量
*/
private static int cutPie(int before,int knife){
return before + knife;
}
}
结果:
方式一切 0 刀最多得到 1 块饼
方式二切 0 刀最多得到 1 块饼
方式一切 1 刀最多得到 2 块饼
方式二切 1 刀最多得到 2 块饼
方式一切 2 刀最多得到 4 块饼
方式二切 2 刀最多得到 4 块饼
方式一切 3 刀最多得到 7 块饼
方式二切 3 刀最多得到 7 块饼
方式一切 4 刀最多得到 11 块饼
方式二切 4 刀最多得到 11 块饼
方式一切 5 刀最多得到 16 块饼
方式二切 5 刀最多得到 16 块饼
方式一切 6 刀最多得到 22 块饼
方式二切 6 刀最多得到 22 块饼
方式一切 7 刀最多得到 29 块饼
方式二切 7 刀最多得到 29 块饼
方式一切 8 刀最多得到 37 块饼
方式二切 8 刀最多得到 37 块饼
方式一切 9 刀最多得到 46 块饼
方式二切 9 刀最多得到 46 块饼
方式一切 10 刀最多得到 56 块饼
方式二切 10 刀最多得到 56 块饼