Sword14- I——剪绳子
方法1——贪心算法
思路:因为要考虑的是最后结果的最大乘积,将最大乘积的最优解因子,再分解为组成该因子的最大乘积的最优解因子,此处的最优解即为因子之和要尽量小。举个例子,要求最大乘积为36,其最优解因子为6和6,而不是1和36、2和18、3和12等,对于因子6而言,其最优解因子为2和3,而不是1和6 首先明确的是,n大于等于2(即n最小为2),m大于1(即m最小为2)
当n等于2时,最少分为两段,最优解的最大乘积为1 * 1 = 1 当n等于3时,最少分为两段,最优解的最大乘积为1 * 2 = 2 当n等于4时,最少分为两段,最优解的最大乘积为2 * 2 = 4 当n等于5时,最少分为两段,最优解的最大乘积为2 * 3 = 6 当n等于6时,最少分为两段,最优解的最大乘积为3 * 3 = 9 当n等于7时,最少分为两段,最优解的最大乘积为3 * 4 = 12;等价于分为三段,3 * 2 * 2 = 12 当n等于8时,最少分为两段,最优解的最大乘积为4 * 4 = 16,等价于分为四段,2 * 2 * 2 * 2 = 16 由上述可知
当n小于4时,即为不可再分,其结果为n - 1; 当n等于4时,可以视为n大于4进行比较,相当于直接分解出一个等于4的数 当n大于4时,将其尽可能分解为较大值3,留下的数若仍然大于4,则可继续再分,而最后留下的数必然小于等于4;为什么要留下n为小于等于4呢?因为在4以内的最大乘积就是n为4,因此可不需要再分 根据上述推导
当n等于9时,首先分出一个3,得到6;之后再分出一个3,得到3;3小于等于4;因此总和为3 * 3 * 3 = 27 当n等于10时,首先分出一个3,得到7,;之后再分出一个3,得到4;4小于等于4;因此总和为3 * 3 * 4 = 36 特殊情况与临界分析:n小于4时,直接返回结果n - 1 终止条件:当n划分成为小于等于4时,即为不可再分 步骤:
n小于4的情况,结果为n - 1 定义结果为1,便于乘以所有可取的3 循环条件:n大于4 while循环
返回结果,注意:res还需要乘以最后留下的小于等于4的数
public int cuttingRope ( int n) {
if ( n < 4 ) {
return n - 1 ;
}
int res = 1 ;
while ( n > 4 ) {
res *= 3 ;
n -= 3 ;
}
return res * n;
}