最优分解(贪心)
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第一段);
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; }
相关文章推荐
- 常规功能和模块自定义系统 (cfcmms)—026开发日志(创建ManyToMany的column)
- iosclient暑期“动画屋“活动项目总结
- ATT 解锁手机
- iOS-QuartzCore(CAAnimation.h--解读)
- iOS导航控制器
- javaEE web开发中文乱码分析
- Yii2的深入学习--事件Event
- 淘宝弹性布局方案lib-flexible实践
- 最新CAX/EDA/CFD/GIS/光学/化工/液压软件资源网
- 3Sum
- omnet++4.0安装使用
- jquery性能优化
- RabbitMq消息序列化简述
- 命令模式
- MyCat简单搭建使用
- 抽象类和接口
- fileload
- 使用Hibernate 拦截执行sql语句,并输出sql语句,获取sql语句
- LeetCode Generate Parentheses
- Date