整数分解使得积最大
2012-08-14 19:16
1521 查看
题目:
给一个数n,你可以将这个数拆成任意个整数之和。找出在所有的拆分方式中,拆出来的所有的数的积的最大值(也包括只拆成一个数,如2拆成2最大)。如 n = 6, 可以拆成
3 * 3 = 9 2 * 4 = 8
2 * 2 * 2 = 8 1 * 1 * 4 = 4
1 * 1 * 2 * 2 = 4 ...
最大值为9。
分析:
比较容易想到的是使用动态规划来解该题。首先找出状态方程,可以设f(n)为n拆分后积最大的值,则f(n)=max{i*f(n-i)}, i=1,2...n-1。其中f(1)=1, f(2)=2。使用递归效率上可能会有点问题,不过也很容易改成非递归。动态规划法代码:
//递归法 int f(int N) { if (N == 1 || N == 2) return N; int max = N; for (int i = 1; i < N; i++) { int tmp = i * f(N - i); if (tmp > max) max = tmp; } return max; }
如果题目改成分解的数字不能有重复,比如6不能分解为3+3,则可以参见http://blog.csdn.net/jqmczx/article/details/6400723的分析。
相关文章推荐
- 正整数分解使得乘积最大问题
- 贪心算法----正整数分解问题 和相同,乘积最大
- 一道题:给定一整数序列A1,A2,...,An(可能有负数),求A1到An的一个自序列,使得Ai到Aj的和最大。例如:整数序列-2,11,-4,13,-5,2,-5,-3,12,-9的最大子序列为21
- 整数分解之和最大问题(全分成3,少分成2)
- 输出正整数分解的所有数的最大乘积
- 有一个整数n,将n分解成若干个整数之和,问如何分解能使这些数的乘积最大,输出这个乘积m
- 将整数数组进行m等分,使得每一个部分的和相等且m最大
- 整数的分解与求最大最小组合!
- 数和分解,乘积最大-vijos整数分解(版本2)
- poj 1032 Parliament 把自然数N分解成若干个互不相同的正整数,使乘积最大;
- 对于给定的整数集合S,求出最大的d,使得a+b+c=d。
- 对于给定的整数集合S,求出最大的d,使得a+b+c=d。
- 积最大的整数分解
- ccsu 1090 积最大的整数分解
- (Relax 水题1.2)POJ 1032 Parliament(将n分解成若干个互不相等的整数的和,并且是这些整数的乘积最大)
- 把自然数N分解成若干个互不相同的正整数,使乘积最大
- 整数分解成不同加数的最大乘积
- 积最大的整数分解
- 从三个排好序的整数数组中分别选一个元素,使得这三个元素的最大差最小
- 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。