最优分解问题 (intDiv.cpp)

最优分解问题

(intDiv.cpp

【题目描述】

    n是一个正整数,现在要求将n分解为若干互不相同的自然数的和,且使这些自然数的乘积最大。

解题思路

    a+b=const,则|a-b|越小,a*b越大。

    运用贪心算法:将n分成从2开始的连续自然数的和,如果最后剩下一个数,将此数在后项优先的方式下均匀地分给前面各项。

例如:

    n先分成23789,还剩2(9>2) ,则把98都加上1n最后被分成了237910

   还要考虑如果n先分成234,还剩s=4(4==4) ,则把s--, 分解的自然数4+1=5,然后在把532都加上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

猜你喜欢

转载自blog.csdn.net/AengusChen/article/details/76390986