题意:简单说,就是给你一个数n(5=<N<=1000),然后把这个数拆分成许多不同的自然数,使得这些自然数的乘积最大。

解题:无意中在一个奥数网站上看到整数拆分这个知识,觉得不错就搜了一个水题试试,结果果然很神奇;

根据均值不等式得,可知最好拆分后的数相差不要太大。可以从自然数2加起,用sum(n)表示和,sum(2)=2,使其满足sum(n-1)<N;sum(n)>=N;

则sum(n)-N的差值只可能是0,1,……n-1。

1、当差值是0,就讲a拆分成2,3,……n-1,n;

2、当差值是1,就将2去了,加到最后的n上即:3,4,……n-1,n+1;

3、当差值大于1,就在拆分的结果中找到和差值相等的那个数,把它去掉就好了。

详细的请到那个奥数网页http://www.aoshu.com/e/20090920/4b8bd0191bae7.shtml上查看,但是提醒读者,他这个网页上讲的有点错误,就是当差值为1的时候,下面已有本人的留言给予纠正。

同时在其他博客上也看了一点证明(以下摘抄自它人博客http://blog.himdd.com/?p=1918):

假设最大积的分解为:
N=a1+a2+a3+…+a[t-2]+a[t-1]+a[t] (t是分解的数目,a1<a2<a3<...<a[t-2]<a[t-1]<a[t])
 下面是该数列的性质及其证明:
1)a1>1;
如果a1=1,则a1和a[t]可以由a[t]+a1=a[t]+1来替代,从而得到更大的积;

2)对于所有的i,有a[i+1]-a[i]<= 2;
如果存在i使得a[i+1]-a[i]>=3,则a[i]和a[i+1]可以替换为a[i]+1,a[i+1]-1,从而使乘积更大;

3)最多只存在一个i使得a[i+1]-a[i]=2;
如果i< j且a[i+1]-a[i]=2、a[j+1]-a[j]=2,则a[i],a[j+1]可以替换为a[i]+1,a[j+1]-1,从而使得乘积更大;

4)a1<=3;
如果a1>=4,则a1和a2可以替换为2,a1-1,a2-1,从而使得乘积更大;

5)如果a1=3且存在i满足a[i+1]-a[i]=2,则i一定等于t-1;
如果i<t-1,则a[i+2]可以替换为2,a[i+2]-2,从而使得乘积更大;< p="">

将上面5条性质综合一下,得到该数列满足:
1)1< a1< 4
2)a[i+1]-a[i] <=2(该序列按升序排序)
3)a[i+1]-a[i]=2的情况最多只有一个

因此,我们得到最大的乘积的做法就是求出从2开始的最大连续(由上面总结的性质2和3可知)自然数列之和A,使得A的值不超过N,具体分析如下:
对输入的N,找到k满足:
A=2+3+4+...+(k-1)+k <= N < A+(k+1) = B
假设N=A+p(0<=p< k+1),即A+p是最大积的数列
1)p=0,则最大积是A;
2)1<=p<=k-1,则最大积是B-{k+1-p},即从数列的最大项i开始,从大到小依次每项加1,知道p=0为止;
3)p=k,则最大积是A+p=A+k=A-{2}+{k+2};( =3+4+...+k+( k+2) )。

本人代码如下:

#include <stdio.h>
int main()
{int n,shu[1000];while(~scanf("%d",&n)){int sum=0,i,j;for(i=2;sum+i<n;i++){shu[i-1]=i;sum+=i;}sum+=i;shu[i-1]=i;shu[0]=i-1;if(sum==n){for(i=1;i<=shu[0];i++)printf("%d ",shu[i]);printf("\n");}if(sum-n==1){for(i=2;i<shu[0];i++)printf("%d ",shu[i]);printf("%d ",shu[i]+1);printf("\n");}if(sum-n>=2){for(i=1;i<=shu[0];i++){if(sum-n!=shu[i])printf("%d ",shu[i]);}printf("\n");}}
}

poj 1032 Parliament 整数拆分相关推荐

  1. python 整数 拆分 分段

    整数 拆分 分段 不平均分 int1 = 68 # 整数 sub = 3 # 要分成几段 interval = int1 // sub rem = int1 % sub print("余数: ...

  2. LeetCode-动态规划基础题-343. 整数拆分

    描述 343. 整数拆分 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 ...

  3. python分割数字_python实现整数拆分,输出拆分序列

    昨天笔试VIPKID有一道关于整数拆分的题目,要求输出拆分后的序列,当时没有做出来,记录一下可以实现的想法: 题目示例: 从键盘读入一个数 n, 输出所有和为 n 的子序列和,包括 n 测试用例: 输 ...

  4. leetcode 343. Integer Break | 343. 整数拆分(Java)

    题目 https://leetcode.com/problems/integer-break/ 题解 一开始以为,只要是 3 个数相加就可以,于是在错误的方向上越走越远: 后来发现并不只是 3 个数, ...

  5. 《dp补卡——343. 整数拆分、96. 不同的二叉搜索树》

    343. 整数拆分 1.确定dp数组以及下标含义. dp[i]:分拆数字i,可以得到的最大的乘积 2.确定递推公式: dp[i]最大乘积出处:从1遍历j到i,j * dp[i-j] 与 j * (i- ...

  6. 343. 整数拆分 golang 动态规划

    题目 整数拆分 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 ...

  7. LeetCode 1808. 好因子的最大数目(整数拆分,乘积最大)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个正整数 primeFactors .你需要构造一个正整数 n ,它满足以下条件: n 质因数(质因数需要考虑重复的情况)的数目 不超过 prime ...

  8. leetcode - 343. 整数拆分

    343. 整数拆分 -------------------------------------------- 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获 ...

  9. HDU 4651 Partition(整数拆分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:给出n.求其整数拆分的方案数. i64 f[N]; void init() {     f ...

最新文章

  1. 昆仑网(D×××)去中心化虚拟互联网基础功能图片式介绍,请全屏看。
  2. clientdataset 过滤 in_天心大风量亚高效过滤器
  3. java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)
  4. vue及脚手架的下载安装,创建项目
  5. 微信小程序开发 使用高德地图(精准一些)
  6. CPU并行与GPU并行联系及区别
  7. WordPress程序备受喜爱的原因:十八般武艺
  8. 图片盒子控件 winform 114868210
  9. Memcahce(MC)系列(三)Memcached它PHP转让
  10. 内置函数dict()字典
  11. Cocos2d-x 3.0 开发(四)使用CocoStudio创建UI并载入到程序中
  12. 什么标签用于在表单中构建复选框_以下 ( ) 标签用于在表单中构建复选框 。_IP通信技术答案_学小易找答案...
  13. 电商数据抓取是什么意思?有什么作用?
  14. 射频微波天线知识点整理
  15. Win10 Windows Defender自动删除破解工具的exe文件
  16. 视频p2p php,m3u8视频播放器集成p2p加速源码分享
  17. 如何在阿里云注册域名-阿里云域名注册与域名解析完整教程
  18. 如何保持福禄克CFP2-100-Q、OFP2-100-Q等光纤测试仪器的洁净?
  19. mysql docker oom_记一次 K3s MySQL 启动 OOM 排查
  20. C# 面试EF 和mvc

热门文章

  1. 微软Edge浏览器衰落之谜:“自杀”还是“他杀”
  2. 2018年长沙理工大学第十三届程序设计竞赛 D zzq的离散数学教室1(素数表)
  3. guido python_guido给python语言起名的原因-guido给Python语言起名
  4. 如何分析挖掘竞争对手的方针方法与策略
  5. win7更新win10错误代码0x80072f8f-0x20000的解决方法
  6. RocketMq怎么保证消息不丢失
  7. python:单引号,双引号和三引号的区别
  8. 苹果x漫画脸_郑爽现在的“苹果肌”好饱满!胖成小圆脸之后,反倒比18岁还美了...
  9. mysqladmin 创建数据库
  10. 分享下.NET程序读取二代身份证(附源码