如何通过动态规划高效拆分整数以最大化乘积?
问题定义
给定正整数N和K,将N拆分为K个正整数之和,求这些数的乘积最大值。例如,N=10,K=3时,最优拆分是3+3+4,乘积为36。
核心思路
- 分解子问题:设dp为将n拆分为k个数的最大乘积。
- 状态转移:对于每个n和k,遍历可能的拆分点i(1≤i≤n-k+1),计算i与剩余部分的最大乘积:
dp=max{i×dp}。 - 边界条件:当k=1时,dp=n;当n<k时,无解返回0。
动态规划表格示例
N\K | 1 | 2 | 3 | 4 |
---|---|---|---|---|
2 | 2 | 1×1=1 | 0 | 0 |
3 | 3 | 1×2=2 | 1×1×1=1 | 0 |
4 | 4 | 2×2=4 | 1×1×2=2 | 1×1×1×1=1 |
5 | 5 | 2×3=6 | 2×2×1=4 | 1×1×1×2=2 |
10 | 10 | 5×5=25 | 3×3×4=36 | 2×3×3×2=36 |
关键优化
- 空间压缩:使用一维数组滚动更新,减少内存占用。
- 数学规律:当K≥2时,最优解趋向于拆分出尽可能多的3,余数处理为2或4(如3+3+4优于3+3+2+2)。
代码框架
python复制defmax_product(n,k):
ifn<k:
return0
dp=()*(k+1)for_inrange(n+1)
foriinrange(1,n+1):
dp=i
forjinrange(2,k+1):
foriinrange(j,n+1):
forxinrange(1,i-j+2):
dp=max(dp,x*dp)
returndp
应用场景
该问题可扩展至资源分配、组合优化等领域,例如最大化利润分配或最小化能耗拆分任务。