划分数
2015-10-22 23:25
246 查看
将正整数N拆分成若干个正整数之和,有多少种不重复的拆分方案
例如 5=5,5=4+1,5=3+2,5=3+1+1,5=2+2+1,5=2+1+1+1,5=1+1+1+1+1 共七种
分析:dp(i,j)表示将i拆成若干个数字,最大的那个数字不超过j的方案数。
则有两种情况,第一种是最后一个数不超过j-1,此时方案数为g(i,j-1).否则最后一个数字刚好是j,此时方案数为g(i-j,j)。
所以g(i,j) = g(i,j-1)+g(i-j,j)。g(n,n)即为答案
例如 5=5,5=4+1,5=3+2,5=3+1+1,5=2+2+1,5=2+1+1+1,5=1+1+1+1+1 共七种
分析:dp(i,j)表示将i拆成若干个数字,最大的那个数字不超过j的方案数。
则有两种情况,第一种是最后一个数不超过j-1,此时方案数为g(i,j-1).否则最后一个数字刚好是j,此时方案数为g(i-j,j)。
所以g(i,j) = g(i,j-1)+g(i-j,j)。g(n,n)即为答案
#include <bits/stdc++.h> using namespace std; const int maxn = 5005; typedef long long ll; ll dp[maxn][maxn]; //dp(i,j)表示将i拆成若干数字,最大的那个数字不超过j的方案数 int main(){ int n; while(scanf("%d",&n) != EOF){ memset(dp,0,sizeof(dp)); dp[0][0] = 1; for(int i = 0;i <= n;i++){ for(int j = 1;j <= n;j++){ if(i-j >= 0) dp[i][j] = dp[i][j-1]+dp[i-j][j]; else dp[i][j] = dp[i][j-1]; } } printf("%lld\n",dp ); } return 0; }
相关文章推荐
- Altium Designer 对覆铜的切割和挖孔
- 《金缕曲·十五年》
- git 分支无法切换问题
- ssh远程链接的原理及方法
- 找两条单链表的公共结点
- iOS开发学习之C语言---C08 高级指针-12
- IOS 开发UI篇—iOS开发中三种简单的动画设置
- JSP/Servlet-----9、JSP的9个内置对象(脚本中使用)
- 《基于MVC的JavaScript Web富应用开发》 电子工业出版社 (二)
- Android三种播放视频的方式
- 解决linux删除文件后不释放磁盘的问题
- stm32模拟鼠标的单击/右击/滑动,给pc上报的数据如下
- iOS开发学习之C语言---C08 高级指针-1
- apache下开启ssl访问,即https
- No resource found that matches the given name 'Theme.AppCompat.
- 转:修改Android签名证书keystore的密码、别名alias以及别名密码
- 课程架构指南
- 栈的应用——四则表达式求值
- iOS开发学习之C语言---C07 指针-2
- 转:Eclipse ADT的Custom debug keystore所需证书规格