最大乘积

【问题描述】

一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。现在你的任务是将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。

【输入格式】

只一个正整数n,(3≤n≤10000)。

【输出格式】

第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。

第二行是最大的乘积。

【样例输入】           【样例输入】

10                          2 3 5

30

【问题分析】

怎么分解乘积最大?不妨设两个数为a, b, 那么,设 a = k + z, b = k - z

那么a * b = (k + z)(k-z) = k ^ 2 - z ^ 2

显然, 当 z 越小时, 两数乘积最大。

那么对于这道题目呢?

{ a, b 为整数,a,b 不相同}

那么也就是说当b = a + 1时 他们的乘积是最大的。

对于一个数 n 来说, 也就是 把它分解成 1, 2, 3, ... , n(n+1)/2时乘积是最大的!?

但是 将他 分解出一个 1 好像并不会使乘积最大,相反的还会占用一个数的空间,所以我们选择

从 2 开始分解。

如: 9 = 2 + 3 + 4

8 = 2 + 3 + 4?

很快又发现问题了,2+3+4 > 8,那么我们就想一想 2+3 + 几 = 8

显然 这个叫几的东西 = 3。

那么这个 3 怎么办呢?

由题意每一个被分解出来的数都不相等, 那我们只能把这个 3 前面的 2 和 3 分别加上 1, 以保证 a, b间的差值最小。

此时分解出来的是 3,4,1 , 第三个数 还剩下一个 1, 显然不能使乘积最大, 所以我们再次从后往前逐个加1, 知道第三个数为0.

从后往前加?

显然从前往后加会造成数字的重复。

接着用高精度来求乘积就好了(因为 n 最大为 10000)

【代码】

1 #include

2 #include

3

4 int n = 0, arr[200];5

6 std::vector ans; //high precision computation

7

8 inline void mulpty(const int&tmp) {9 int x = 0;10 for(int i = 0; i != ans.size(); i++) {11 ans[i] = ans[i] * tmp +x;12 x = ans[i] / 10;13 ans[i] %= 10;14 }15 while(x) {16 ans.push_back(x % 10);17 x /= 10;18 }19 }20 intmain() {21 scanf("%d", &n);22

23 for(int i = 1, sum = 0; ; i++) {24 arr[i] = i + 1;25 sum +=arr[i];26 if(sum == n) break;27 if(sum >n) {28 sum -=arr[i];29 arr[i] = n -sum;30 if(arr[i] <= arr[i-1]) {31 while(arr[i]) {32 for(int j = i - 1; j >= 1; j--) {33 if(!arr[i]) break;34 arr[j]++;35 arr[i]--;36 }37 }38 }39 break;40 }41 }42

43 for(int i = 1; arr[i] != 0; i++) {44 printf("%d", arr[i]);45 }46 ans.push_back(arr[1]);47 for(int i = 2; arr[i] != 0; i++) {48 mulpty(arr[i]);49 }50 printf("\n");51 for(int i = ans.size() - 1; i >= 0; i--) {52 printf("%d", ans[i]);53 }54

55 }

上面代码的arr数组表示分解出的数字,ans是用来求乘积的。

贪心 最大乘积 java_最大乘积|贪心算法|FOJ1698|TYVJ3024相关推荐

  1. 最大乘积|贪心算法|FOJ1698|TYVJ3024

    [题目链接]TYVJ3024 最大乘积 [问题描述] 一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,-.现在你的任务是将指定的正整数 ...

  2. 算法高级(28)-递归、分治、动态规划、贪心、回溯、分支限界几大相似算法比较

    在学习算法的过程中,递归.分治.动态规划.贪心.回溯.分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们之间还是有一些不同之处的,我来给同学们整理一下. 一.算法思想 ...

  3. 牛客网:给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)

    题目描述 给定一个无序数组,包含正数.负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1) 输入描述: 无序整数数组A[n] 输出描述: 满足条件的最大乘积 ...

  4. 离散数学·(不调用第三方库)普通矩阵乘积/关系矩阵乘积,理论+python代码实现

    矩阵乘法如何计算? 普通矩阵乘法:第一个矩阵的列数等于第二个矩阵的行数. 矩阵关系运算前提: (1)第一个矩阵的列数等于第二个矩阵的行数. (2)两个矩阵的元素均是0或1. 这里以关系矩阵乘法为例: ...

  5. 部分背包的贪婪算法 java_使用JAVA实现算法——贪心算法解决背包问题

    packageBasePart;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.IOException ...

  6. 最大乘积java_《算法入门经典》-最大乘积(java实现)

    输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列.如果这个最大的乘积不是正数,应该输出-1(表示无解).1<=n<=18,-10<=Si<=10 输入: 3 2 4 ...

  7. leetcode - 53. 最大子序和 152. 乘积最大子序列 - 两个算法之间的联系和区别

    这两道算法题的解题思路是差不多的,但是从整体上分析,乘积最大子序列之和是最大子序和的进阶.先来看看两道算法题的简单描述. 53.最大子序和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组 ...

  8. n分解后的最大乘积java_【编程题】乘积最大的拆分

    题意:给出一个数n,将其拆分为若干个互不相等的数字的和,要求这些数字的乘积最大. 分析:我们可以发现任何一个数字,只要能拆分成两个大于1的数字之和,那么这两个数字的乘积一定大于等于原数.也就是说,对于 ...

  9. 基础算法:给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)

    这里要注意的是当数字足够大的时候,我们要使用long long形式的类型,用来记录那个最大值 最大值共有四种情况: 三个正数:数字本身越大则乘积越大 两个负数一个正数:负负得正,所以两个负数最小,之积 ...

最新文章

  1. 然并卵:BF 科普 BF 解释器的 JS 实现
  2. php数组合并 要保持两个数组的键名都不变
  3. 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
  4. 公网访问_一文读懂阿里云访问公网的实现方式
  5. 【华为云技术分享】华为开发者大会HDC.Cloud带你探索强化学习三大挑战及落地实践
  6. 软件工程复习笔记 UML
  7. SAP MM ‘Pricing Date Control‘字段的理解
  8. python3读取本地_Python3 获取本机 IP
  9. Linux 符号链接与 inode
  10. 魔改部署自己专属的合成大西瓜(三:上线篇<踩坑篇>)
  11. js 实现PHP中的in_array()
  12. linux 内核同步机制之complete
  13. Logback 深入分析
  14. Python基础语言学习 day 6 ——列表的遍历、增删改、相关操作、函数和方法
  15. 软件测试测试用例—用户注册界面
  16. 声纹技术(一):声纹技术的前世今生
  17. ssm+vue学生网络作业管理系统java maven
  18. perl的Math::Combinatorics模块实现全排列
  19. 用IOS手机看epub小说,哪些阅读器APP更好用?
  20. [简历] PHP 技能关键字列表

热门文章

  1. 湛江计算机学校中专,湛江中专院校名单 湛江有哪些中专学校
  2. Gnocchi: 1、Gnocchi源码分析
  3. 作业帮上万个 CronJob 和在线业务混部,如何解决弱隔离问题并进一步提升资源利用率?
  4. 太酷炫了,用python绘制股票K线图!
  5. 毛泽东《浪淘沙·北戴河》气势磅礴
  6. Android 实现书籍翻页效果----完结篇
  7. 【网安神器篇】——WPScan漏洞扫描工具
  8. 为什么阿里的程序员成长如此之快?最新BAT大厂面试者整理的Android面试题目模板,涨姿势了!
  9. vscode python导入模块
  10. 电子计算机协会总体目标,d.l.l计算机协会2012年纳新计划书.doc