问题描述:
设n是一个正整数。
(1)现在将n分解为若干个互不相同的自然数之和,且使这些自然数的乘积最大。
(2)现在将n分解为若干个自然数之和,且使这些自然数的乘积最大。

编程任务:对于给定的正整数n,编程计算问题(1)和(2)的最优分解的最大乘积。

注意:

这里的自然数不含0但允许为1。
特别地,当整数n无法分解为若干互不相同的加数时,即自身视为单独的一个加数,比如输入2,问题(1)的解输出为2。而如果整数n可以分解为若干互不相同的加数时,不考虑自身为单独加数的情况,比如4,问题(1)的解输出为3,而非4。
若干互不相同自然数或若干自然数,这个若干可>=1,也就是可以为1。
分析:
(1)分解为互不相同自然数之和
贪心策略:
当n等于1至4时单独处理。n大于4时,将n分成从2开始的连续的自然数的和。如果最后剩下一个数,将此剩余数在后项优先的方式下均匀地分给前面各项。

(2)分解为若干自然数之和
贪心策略:
极尽拆解,尽可能先将n拆成3,3,3,…,3;若拆成若干3后还有剩余,则为2,或2和2。

归纳公式如下:
1)max{m1m2…mk} = 3^(n/3) if n(mod 3)等于0
2)max{m1m2*…mk} = 431 if n(mod 3)等于1
3)max{m1m2…mk} = 232 if n(mod 3)等于2

#include <iostream>
#include <cmath>using namespace std;long long one(int n) {//现在将n分解为若干个互不相同的自然数之和,且使这些自然数的乘积最大。long long count = 1;if (n == 1 || n == 2) {return n;}if (n == 3) {return 2;}if (n == 4) {return 3;}else {for (int i = 2; i < 10000; i++) {n = n - i;count *= i;if (n == ((i + 1) + (i + 2))) {count = count * (i + 1) * (i + 2);return count;}if (n > (i + 1) + (i + 2)) {continue;}else {//这里回溯,然后再计算重新分配的值for (int j = 1; j <= n - i - 2; j++) {count /= (i - j + 1);}for (int j = 1; j <= n - i - 1; j++) {count *= (i - j + 3);}break;}}}return count;
}long long two(int n) {/*归纳公式如下:
1)max{m1*m2*...*mk} = 3^(n/3)        if n(mod 3)等于0
2)max{m1*m2*...*mk} = 4*3^[(n-4)/3]  if n(mod 3)等于1
3)max{m1*m2*...*mk} = 2*3^[(n-2)/3]  if n(mod 3)等于2*/if (n % 3 == 0) {return pow(3, n / 3);}if (n % 3 == 1) {return pow(3, (n - 4) / 3) * 4;}if (n % 3 == 2) {return pow(3, (n - 2) / 3) * 2;}
}int main() {int n;cin >> n;cout << one(n) << " ";cout << two(n);return 0;
}

11091 最优自然数分解问题相关推荐

  1. 自然数分解:任何一个自然数m的立方均可写成m个连续奇数之和。编程实现:输入一自然数 n,求组成 n3的 n个连续奇数。

    标题 自然数分解 类别 流程控制 时间限制 2S 内存限制 1000Kb 问题描述 任何一个自然数m的立方均可写成m个连续奇数之和.例如: 13=1 23=3+5 33=7+9+11 43=13+15 ...

  2. 自然数分解(罗列出一个自然数的加数的所有组合)(回溯)

    自然数拆分问题: 一个整数N(N > 1)可以拆分成若干个大于等于1的自然数之和,请你输出所有不重复的拆分方式. 6 = 3 + 2 和 6 = 2 + 3, 就是重复的拆分方式. 输入: 6 ...

  3. Python实现大自然数分解为最多4个平方数之和(1)

    问题描述:任意大自然数,总是能分解为最多4个平方数的和,所谓平方数是指它是一个自然数的平方.例如:72884 = 4^2 + 138^2 + 232^2,33788 = 1^2 + 3^2 + 17^ ...

  4. 自然数分解求最大乘积

    题目: 把正整数n分解成若干个互不相等的自然数的和,且使这些自然数的乘积最大.请你编写一个算法,由键盘输入n,求满足条件的分解方案. 输入: n (3<=n<=1000) 输出:乘积 分析 ...

  5. 老赵的自然数分解——少侠之对象解

    自然数分解算法的起因介绍,老赵 前几天贴了个非递归的 今天继续搞一个使用对象的解 坚持用对象来解决问题的一个原因,是想证明使用面向对象不是造成算法速度慢的根本原因 例如,我这个面向对象的解,其运行速度 ...

  6. xdoj_64自然数分解

    问题描述 任何一个自然数 m 的立方均可写成 m 个连续奇数之和.例如: 1 3 = 1 1^3=1 13=1 2 3 = 3 + 5 2^3=3+5 23=3+5 3 3 = 7 + 9 + 11 ...

  7. 将任意自然数分解为质数的乘积(Java实现)

    方法一:外层while循环 package com.jake.primefactor;import java.util.ArrayList; import java.util.List;public ...

  8. c语言100以内分解质因数,用C语言实现,将100以内的自然数分解质因数

    仅供参考,尽管是C# //****************************************************************************** // Autho ...

  9. 晴天的魔法乐园——自然数分解之最大积(深度优先+剪枝)

    题目链接:https://judger.net/problem/1062 Problem Description 给定一个正整数N,将它表示成至少两个正整数之和(即N=a1+a2+-+ak, k &g ...

最新文章

  1. 盘点:2020年最酷的12家机器学习初创公司
  2. redis操作大数据
  3. 线段树合并复杂度证明
  4. QT+OpenCV综合示例:载入、读取图片
  5. h5获取http请求头_java学习之路(2),http协议,request类
  6. MSSQLServer基础07(事务,存储过程,分页的存储过程,触发器)
  7. session的removeAttribute()和invalidate()的区别
  8. 全球最贵红绿灯之谜得解,原来是百度Apollo的B面
  9. linux mysql 升级_linux mysql5.7升级到mysql8.0
  10. 系统建模与计算机仿真内容,系统建模与计算机仿真
  11. linux内核剖析之traps.c
  12. python 波浪号用法_波浪号(~)是什么意思,正规的用法是什么?
  13. 学生信息管理系统(数据库)
  14. [HITS算法]Authoritative Sources in a Hyperlinked Environment
  15. 知识兔课程揭秘2021抖音卖货代运营的新骗局,你中招了吗?
  16. SSID的使用和中文设置
  17. 【评分卡开发】信用评分模型构建流程
  18. Leetcode-93. 复原 IP 地址
  19. android播放ts格式文件,android上实现离线缓存播放加密HLS视频和未加密的HLS视频...
  20. adb模拟按键home_adb 命令模拟按键事件 模拟 点击 事件

热门文章

  1. Java+Selenium+Junit demo
  2. 厌倦了996模式?来看看国内995制度的公司!
  3. word2016设置整行背景颜色
  4. Java实现替换Word中文本
  5. oneplus 驱动_450美元的旗舰旗舰产品OnePlus Nord动手实践
  6. CMD里如何用DiskPart命令删除分区
  7. java c语言与人工智能_C语言与LISP语言的区别
  8. 常见的ICE工具和集成开发环境
  9. html怎么改变li前面的点,CSS定义li前面的小点样式
  10. python计算模型psi_模型稳定度指标PSI与IV