最优自然数分解问题
问题描述:
设n是一个正整数。现在将n分解为若干个互不相同的自然数之和,且使这些自然数的乘积最大。
样例输入
10样例输出30
解:
最优分解问题:
若a+b等于一个常数,则|a-b|越小,ab就越大。
要使得加数互不相同,又尽可能集中,那加数只能是连续的自然数了。
将n分成从2开始的连续的自然数的和。如果最后剩下一个数,
将此剩余数从后项开始的方式下均匀地分给前面各项。
如:10
首先分解为:2+3+4 剩余 1
从后开始,所以 1 加到 4 上
变成 2+3+5,此时乘积最大
#include <stdio.h> int main() { int n; int a[100]; scanf("%d",&n); int x=2; int index=0; a[index++]=x; n-=x; while(n>a[index-1]) { a[index]=a[index-1]+1; n-=a[index]; index++; } int num=index-1; while(n) { a[num]++; num=(num-1+index)%(index); n--; } int result=1; for(int i=0;i<index;i++) { result*=a[i]; } printf("%d\n",result); return 0; }