您的位置:首页 > 其它

最优分解(贪心)

2015-12-23 08:42 274 查看
Description:设n是一个正整数。现要求将n分解为若干个自然数的和,且使这些自然数的乘积最大。对于给定的正整数n,编程计算最优分解方案。

Sample Input:

10

Sample Output:

36

analysis:

若 a + b = c,则 | a – b | 越小,a × b 越大。根据原问题的描述,需要将正整数 n 分解为若干互不相同的自然数的和,同时又要使自然数的乘积最大。当 n < 4 时对 n 的分解的乘积是小于 n 的;当 n 大于或等于 4 时,n = 1 + ( n
– 1 ) 因子的乘积也是小于 n 的,所以 n = a + ( n – a ),2 ≤ a ≤ n - 2,可以保证乘积大于 n,即越分解乘积越大。将 n 分成从 2 开始的连续自然数的和,如果最后剩下一个数,将此数在后项优先的方式下均匀地分给前面各项,确保最终所分解的自然数的乘积可以取得最大值。

在分解过程中,主要有以下2种情况:

1.当前余数与当前分解出的最后一位数字值相等(如:13 = 2 + 3 + 4 + 4),则最终分解结果必定从3开始(详解于analysis第一段);

2.当前余数与当前分解出的最后一位数字值不等(如:10 = 2 + 3 + 4 + 1),则最终分解结果必定从2开始(详解于analysis第一段);
/*
* =====================================================================================
*
*       Filename:  MulMax.c
*
*    Description:
*
*        Version:  1.0
*        Created:  2015年12月10日 22时33分14秒
*       Revision:  none
*       Compiler:  gcc
*
*         Author:  lafee, wisdomandmircle@gmail.com
*        Company:  Class 1301 of Software Engineering
*
* =====================================================================================
*/

#include <stdio.h>

int MulMax( int num ) {
int	i = 1 , j;
int	mul = 1 ;

while( num > i ) {	//当循环结束,num为当前余数
i++ ;
num -= i ;
}
if( num == i ) {	//当前余数与最后一位分解出的数字相同,如:13 = 2 + 3 + 4(i) + 4(num)
for( j = 3 ; j < i + 3 ; j++ ) {	//最终分解的结果必定从3开始且最后一位数与倒数第二位数之差为2,如:13 = 3 + 4 + 6
if ( j == i + 1 )
continue ;
mul *= j ;
}
} else {
for( j = 2 ; j < i + 2 ; j++ ){		//最终分解的结果从2开始
if( j == i - num + 1 )
continue ;
mul *= j ;
}
}

return mul ;
}

int main() {
int 	num ;
scanf( "%d", &num ) ;
printf( "MUl = %d\n", MulMax( num ) ) ;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: