最优分解问题
(intDiv.cpp)
【题目描述】
设n是一个正整数,现在要求将n分解为若干互不相同的自然数的和,且使这些自然数的乘积最大。
【解题思路】
若a+b=const,则|a-b|越小,a*b越大。
运用贪心算法:将n分成从2开始的连续自然数的和,如果最后剩下一个数,将此数在后项优先的方式下均匀地分给前面各项。
例如:
n先分成2、3…、7、8、9,还剩2,(9>2) ,则把9、8都加上1; n最后被分成了2、3…、7、9、10。
还要考虑如果n先分成2、3、4,还剩s=4,(4==4) ,则把s--, 分解的自然数4+1=5,然后在把5,3,2都加上1
【输入】
输入intDiv.in中包含1个正整数。
【输出】
输出intDiv.out如输出样例,前面几行为分解的自然数,最后一行为这些自然数的乘积。
【输入输出样例1】
intDiv.in |
intDiv.out |
10 |
2 3 5 30 |
【输入输出样例2】
intDiv.in |
intDiv.out |
13 |
3 4 6 72 |
#include
#define N 1000
double dicomp(int n){
int i,k;
double sum=1;
int a[N]={0};
k=1;
if(n<3) return 0;
if(n<5) return n-1;
a[1]=1;
while(n>a[k]){
k++;
a[k]=a[k-1]+1;
n-=a[k];
}
if(n==a[k]){a[k]++;n--;}
for(i=0;i