整数拆分问题_C++
2018-06-17 23:55:44来源:未知 阅读 ()
一、问题背景
整数拆分,指把一个整数分解成若干个整数的和
如 3=2+1=1+1+1 共2种拆分
我们认为2+1与1+2为同一种拆分
二、定义
在整数n的拆分中,最大的拆分数为m,我们记它的方案数为 f(n,m)
即 n=x1+x2+······+xk-1+xk ,任意 x≤m
在此我们采用递归递推法
三、递推关系
1、n=1或m=1时
拆分方案仅为 n=1 或 n=1+1+1+······
f(n,m)=1
2、n=m时
S1选取m时,f(n,m)=1,即n=m
S2不选取m时,f(n,m)=f(n,m-1)=f(n,n-1),此时讨论最大拆分数为m-1时的情况
可归纳 f(n,m)=f(n,n-1)+1
3、n<m时
因为不能选取m,所以可将m看作n,进行n=m时的方案,f(n,m)=f(n,n)
4、n>m时
S1选取m时,f(n,m)=f(n-m,m),被拆分数因选取了m则变为n-m,且n-m中可能还能选取最大为m的数
S2不选取m时,f(n,m)=f(n,m-1),此时讨论最大拆分数为m-1时的情况
可归纳 f(n,m)=f(n,m-1)+f(n-m,m)
总递推式为
代码如下
1 #include <algorithm> 2 #include <iostream> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cstdio> 6 #include <cmath> 7 using namespace std; 8 9 int f(int n,int m) 10 { 11 if ((n!=1)&&(m!=1)) 12 { 13 if (n>m) return f(n-m,m)+f(n,m-1); 14 else return 1+f(n,n-1); 15 } 16 else return 1; 17 } 18 void work() 19 { 20 int n,m; 21 cin>>n>>m; 22 cout<<f(n,m); 23 } 24 int main() 25 { 26 freopen("cut.in","r",stdin); 27 freopen("cut.out","w",stdout); 28 work(); 29 return 0; 30 }
此外还有母函数法,具体参考
http://blog.chinaunix.net/uid-26548237-id-3503956.html
版权所有,转载请联系作者,违者必究
QQ:740929894
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- WDK驱动调试问题点滴 2020-04-21
- 螺旋矩阵问题 2020-04-18
- 用C++实现:完美的代价 2020-04-15
- 用C++实现:FJ的字符串打印 2020-04-04
- [题记]字符串转换整数-leetcode 2020-04-03
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash