贪心算法----正整数分解问题 和相同,乘积最大

一、问题描述

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

本文将这个大问题分解为两个小问题:

(1)这些自然数是互不相同的

(2)这些自然数可以是相同的

二、解决思路

这其实是个数学问题,总体上的宗旨就是分解的数越接近,它们的乘积是最大的,而且不要分解出1,至少从2开始。

针对(1)这个问题,因为这些若干个自然数是不相同的,所以只能是从2开始分解,如2,3,4...这种顺序

在这里,我们把这个分解问题具体化:

9=2+3+4,刚好可以分解这三个连续的数;

10=2+3+4+1,因为1不会增大乘积,反而会占据和,所以应该将其加到前面三个数上,为了保证最大而且互不相同,加到4上,则分解为10=2+3+5;

11=2+3+4+2,如果把2直接加到4上,乘积是2*3*6=36;如果分别加到连续的数上,如3,4,保证这些数之间的差距是最小的,那么乘积是2*4*5=40;

12=2+3+4+3;则这个三分成三个一,加到前面三个数上,保证了连续性;

13=2+3+4+4;因为是四个一,所以我们采取的方法是最后一个数加2,其他加1,那么乘积是:3*4*6=72;

因此总体的策略就是先分解成连续的自然数,将剩余的数按照从后往前的次序一次均匀分配。

针对(2)问题,因为分解的数是可以相同的,所以先比较一下分解成相同的数和不同的数哪种的乘积大。如

6=3+3;6=2+4;

3*3=9;

2*4=8;

所以分解为相同的数保证之间的差距最小,从而乘积也是最大的。自然知道了分解成相同的数的优势后,对于一个整数,我们应该尽可能多得分解成哪种数呢?

对于4来说,只能拆成2+2,因为要避免拆1;且2*2的效果与本身大小是一致的;

对于5来说,只能拆成2+3,因为要避免拆1;且2*3的效果大于5本身;

对于6来说,拆成3+3的效果(9)要好于2+2+2的效果(8);

对于7而言,拆成3+4的效果是最好的;

对于8而言,我们可能第一反应是4+4,效果是16;但是实际上最优的分解式3+3+2,效果是18;

对于10来说,理论上是10=5+5;

但是鉴于5本身还有更好的分解,所以10=(2+3)+(2+3);

所以分解拆数的策略是:先分解成尽可能多得3,然后再分解成2,不要分出1!

考虑任意的一个数,它除以3后的情况只有3种:

(1)整除,余数是0,如9,分解成3+3+3就是最优的;

(2)不整除,余数是1,如10,分解成3+3+4或者3+3+2+2;除了三之外其余的就用2或者4;

(3)不整除,余数是2,如11,分解成3+3+3+2;

三、程序设计

(1)自然数不相同:

(2)分解成可以相同的自然数

四、程序结果

(1)不相同整数的情况:

2*3*5=30;

(2)可以相同整数的情况

3*3*2*2=36;

时间: 2024-08-06 19:43:15

贪心算法----正整数分解问题 和相同,乘积最大的相关文章

[算法]正整数分解为几个连续自然数之和

题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列. 一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 15=7+8 有些数可以写成连续N(>1)个自然数之和,比如14=2+3+4+5:有些不能,比如8.那么如何判断一个数是否可以写成连续N个自然数之和呢? 一个数M若可以写成以a开头的连续n个自然数之和,则M=a+(a+1)+(a+2)+-+(a+n-1)=n*a+n*(n-1)/2,要求a!=0,否则

贪心算法的简述与示例

贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯.能够用贪心算法求解的问题一般具有两个重要特性:贪心选择性质和最优子结构性质. 参考:http://babybandf.blog.163.com/blog/static/61993532010112923767/ [例1]删数问题[B][/B] 试题描

可用贪心算法解决的几个基本问题

可用贪心算法解决的几个基本问题 分类: 算法2011-08-24 12:36 950人阅读 评论(0) 收藏 举报 算法活动作业c 关键:看问题有没有贪心选择性质和最优子结构性质.有些问题看似是可以用贪心算法,但是实际用贪心算法却得不到最优解.构造贪心算法后,需要一定的证明来确定它的正确性.常用证明方法:反证法.调整法. 几个基本问题: 1. 活动安排问题. 设有n个活动的集合e={1,2,-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动

贪心算法练习:数列极差问题

在黑板上写n个正整数排成的一个数列,进行如下操作:每次擦掉其中的两个数a和b,然后在数列里面加入一个数a*b+1,如此循环往复直到黑板上只剩下一个数,在所有按这种操作方式最后得到的数中,最大的记为max,最小的记min,则该数列的极差定义为m=max-min.输入一个正整数n,然后输入n个正整数构成一个数列.输出这n个正整数构成的数列的极差. 1 #include<stdio.h> 2 #include<stdlib.h> 3 long maxNumber;//整个数组里面的最大的

零基础学贪心算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅.贪心算法的定义:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关.解题的一般步骤是:1.建立数学模型来描述问题:2.把求解的问题分成若干个子问题:3.对每一子问题求解,得到子问题的局部最优解:4.把子问题的局部最优

贪心算法

一,贪心算法的设计思想 ? 从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解.当达到某算法中的某一步不需要再继续前进时,算法停止. 二,贪心算法的基本性质 1)贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到.这是贪心算法可行的第一个基本要素,也是贪心法与动态规划法的主要区别. 2) 最优子结构性质 该问题解的整体最优性依赖于其局部子问题解的最优性.这种性质是可以采用贪心算法解决问题的关键特征.例如

算法导论----贪心算法,删除k个数,使剩下的数字最小

先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4,要求的最小数字b是n-k=6位的: 1.先找最高位的数,因为是6位数字,所以最高位不可能在后5位上取到(因为数字的相对顺序是不能改变的,假设如果取了后五位中倒数第5位的7,则所求的b就不可能是6位的了,最多也就是4位的79228)理解这点很重要!所以问题变成从第1位到第k+1(n-(n-k-1))取

贪心算法换零钱(java)

贪心算法思想 贪心算法总是做出在当前看来做好的选择.也就是说贪心算法并不从整体最后考虑,他做出的选择只是局部最优选择.他所做出的仅是在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解. 1.算法思路 贪心算法是一种不追求最优解,只希望得到较为满意解的方法.贪心算法一般可以快速得到满意的解,因为它省去了为找最优姐要穷尽所有肯呢个而必须耗费大量时间.贪婪(心)算法是一种改进了的分级处理方法.其核心是根据题意选取一种

贪心算法(发工资)

发工资咯:) Problem : 430 Time Limit : 1000ms Memory Limit : 65536K description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵 但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢? 这里假设老师的工资都是正整数,单位元,人民币一共有100