剪绳子

题目

题目来源:剪绳子
把一根绳子剪成多段,并且使得每段的长度乘积最大。
n = 2
return 1 (2 = 1 + 1)

n = 10
return 36 (10 = 3 + 3 + 4)

方法——贪心法

尽可能多剪长度为 3 的绳子。
剩余的绳子如果长度为1,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,变成长度4;
剩余的绳子如果长度为2,就将最后一段绳子为2。

证明:至少要切两段,n>=2
当 n >= 5 时,
一段都不剪为n;
剪一段长度为1,得到的乘积为1*(n-1)=n-1 剪一段长度为2,得到的乘积减去啥都不剪时候的乘积为2*(n-2)-n=n-4>0,故切一段2的绳子后,比什么都不切乘积变大了;
剪一段长度为3,得到的乘积减去啥都不剪时候的乘积为3*(n-3)-n=2n-9>0,故切一段3的绳子后,比什么都不切乘积变大了;
那么3和2哪个更好呢?
3*(n-3)-2*(n-2)=n-5>=0,则3要好些。

# C代码
int integerBreak(int n){
    int mul=1;
    switch(n){
        case 2:return 1;
        case 3:return 2;
        case 4:return 4;
        default:break;
    }
    while(n>=3){
        mul=mul*3;
        n=n-3;
    }
    if(n==0){
        return mul;
    }
    else if(n==1){
        return mul/3*4;
    }
    else{
        return mul*2;
    }
}

你可能感兴趣的:(C/C++刷题)