/* 給定一個正整數 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(x)=e^((n/x)lnx)與函數 單調性相同,令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,1,2; 當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=0,1,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; }
動態規划自底向上+遞歸自頂向下待學習!