給定一個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。


/*
給定一個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。
*/
#include<stdio.h>
#include<math.h>

main()
{
    int n,rs=1;
    scanf("%d",&n);
    if(n==2){
        printf("1\n");
        return 0;
    }
    if(n==3){
        printf("2\n");
        return 0;
    }
    while(n>4){
        rs*=3;
        n=n-3;
    }
    printf("%d\n",rs*n);
}

### 解題思路
題目分析:
將正整數n拆分為特定整數x的和,並使這些特定整數n/x個x的乘積最大化,即
![h.png](https://pic.leetcode-cn.com/5de45ff139b93e7047f541a27259777bf3bf8dfd92dea3685f50960efd5f0b56-h.png)


數學推導:
h(x)=e^((n/x)lnx)與函數
![h.png](https://pic.leetcode-cn.com/8104982928f2230b99701bad3b7f19bca7f6a8200b88ec737930c117b0097905-h.png)單調性相同,令f’(x0)=0,因為f’’(x0)<0,得極大值x0=e,則特定數x=e約等於2.78,整數化,x為2或3,又f(3)/f(2)>1,所以取x=3;

結論:
為了獲取最大化的乘積,需要將n拆分更多的3,
令a=n/3;b=n%3;則n=a個3之和+b;
b分為0,12;
當b=0時,max=3^a;
當b=2時,max=3^a*2,若向前借一個2,變成2+3=5,5的最大乘積為3*2=6,為最大乘積,所以不變。
當b=1時,因為拆分為1,所以向前借一個3,變成3+1=4,4的最大乘積為2*2=4,若按原來為3*1=3就小了;所以max=3^(a-1)*4

再討論n:
當n<=3,max=n-1;
當n>=4,按n%3=01,2余數分類

### 代碼

```c
int integerBreak(int n){
    int i,rs=1;
    if(n==2) return 1;
    if(n==3) return 2;
    while(n>4){
        rs*=3;
        n-=3;
    }
    rs*=n;
    return rs;
}
 
        

 動態規划自底向上+遞歸自頂向下待學習!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM