11091 最优自然数分解问题
问题描述:
设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 最优自然数分解问题相关推荐
- 自然数分解:任何一个自然数m的立方均可写成m个连续奇数之和。编程实现:输入一自然数 n,求组成 n3的 n个连续奇数。
标题 自然数分解 类别 流程控制 时间限制 2S 内存限制 1000Kb 问题描述 任何一个自然数m的立方均可写成m个连续奇数之和.例如: 13=1 23=3+5 33=7+9+11 43=13+15 ...
- 自然数分解(罗列出一个自然数的加数的所有组合)(回溯)
自然数拆分问题: 一个整数N(N > 1)可以拆分成若干个大于等于1的自然数之和,请你输出所有不重复的拆分方式. 6 = 3 + 2 和 6 = 2 + 3, 就是重复的拆分方式. 输入: 6 ...
- Python实现大自然数分解为最多4个平方数之和(1)
问题描述:任意大自然数,总是能分解为最多4个平方数的和,所谓平方数是指它是一个自然数的平方.例如:72884 = 4^2 + 138^2 + 232^2,33788 = 1^2 + 3^2 + 17^ ...
- 自然数分解求最大乘积
题目: 把正整数n分解成若干个互不相等的自然数的和,且使这些自然数的乘积最大.请你编写一个算法,由键盘输入n,求满足条件的分解方案. 输入: n (3<=n<=1000) 输出:乘积 分析 ...
- 老赵的自然数分解——少侠之对象解
自然数分解算法的起因介绍,老赵 前几天贴了个非递归的 今天继续搞一个使用对象的解 坚持用对象来解决问题的一个原因,是想证明使用面向对象不是造成算法速度慢的根本原因 例如,我这个面向对象的解,其运行速度 ...
- 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 ...
- 将任意自然数分解为质数的乘积(Java实现)
方法一:外层while循环 package com.jake.primefactor;import java.util.ArrayList; import java.util.List;public ...
- c语言100以内分解质因数,用C语言实现,将100以内的自然数分解质因数
仅供参考,尽管是C# //****************************************************************************** // Autho ...
- 晴天的魔法乐园——自然数分解之最大积(深度优先+剪枝)
题目链接:https://judger.net/problem/1062 Problem Description 给定一个正整数N,将它表示成至少两个正整数之和(即N=a1+a2+-+ak, k &g ...
最新文章
- 盘点:2020年最酷的12家机器学习初创公司
- redis操作大数据
- 线段树合并复杂度证明
- QT+OpenCV综合示例:载入、读取图片
- h5获取http请求头_java学习之路(2),http协议,request类
- MSSQLServer基础07(事务,存储过程,分页的存储过程,触发器)
- session的removeAttribute()和invalidate()的区别
- 全球最贵红绿灯之谜得解,原来是百度Apollo的B面
- linux mysql 升级_linux mysql5.7升级到mysql8.0
- 系统建模与计算机仿真内容,系统建模与计算机仿真
- linux内核剖析之traps.c
- python 波浪号用法_波浪号(~)是什么意思,正规的用法是什么?
- 学生信息管理系统(数据库)
- [HITS算法]Authoritative Sources in a Hyperlinked Environment
- 知识兔课程揭秘2021抖音卖货代运营的新骗局,你中招了吗?
- SSID的使用和中文设置
- 【评分卡开发】信用评分模型构建流程
- Leetcode-93. 复原 IP 地址
- android播放ts格式文件,android上实现离线缓存播放加密HLS视频和未加密的HLS视频...
- adb模拟按键home_adb 命令模拟按键事件 模拟 点击 事件