/*
题目:
	给定一个长度为n的绳子,把绳子剪为m段,(n>1,m>1)
	求各段绳子乘积的最大值。
*/
/*
思路:
	贪婪算法。
	当绳子的长度大于5时,尽可能多的剪长度为3的绳子;当剩下的绳子长度为4时,把绳子剪为两段长度为2的绳子。
*/
/*
证明:
	当n>=5时,2(n-2)>n,3(n-3)>n,也就是当n大于5时,就把它剪为长度为3或2的绳子,且3(n-3)>2(n-2),所以尽可能的剪为长度为3的绳子。
	当n=4时,剪为2*2最大。
*/
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int cutRope(int number){
    if(number <= 1){
        throw("invalid parameter");
    }
    if(number == 2 || number == 3){
        return number-1;
    }
    int timesOf3 = number / 3;
	
	//当剩余长度为4时,剪为2*2
    if(number - timesOf3 * 3 == 1){
        timesOf3 --;
    }
    int timesOf2 = (number - timesOf3 * 3) / 2;
    return (int)(pow(3,timesOf3))*(int)(pow(2,timesOf2));
}


int main(){
    cout<<cutRope(8)<<endl;
}

   

posted on 2019-11-12 21:58  笨宝宝  阅读(193)  评论(0编辑  收藏  举报