第二章 递归与分治策略
2014-04-08 14:55
148 查看
2-5 整数划分问题
1)递归法
2)递归打表法:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=125;
__int64 f[NM][NM];
inline int q(int n,int m) //q(n,m):最大加数n1不大于m的划分个数
{
if(n<1 || m<1) return 0;
if(f
[m]) return f
[m];
if(n==1 || m==1) return f
[1]=f[1][m]=1;
if(n<m) return f
=q(n,n);
if(n==m) return f
[m]=q(n,m-1)+1;
f
[m-1]=q(n,m-1);f[n-m][m]=q(n-m,m);
return f
[m-1]+f[n-m][m];
}
int main()
{
int n;
while(cin>>n){
memset(f,0,sizeof(f));
cout<<q(n,n)<<endl;
}
return 0;
}
1)递归法
#include <iostream> #include <cstdio> #include <cstring> using namespace std; inline int q(int n,int m) //q(n,m):最大加数n1不大于m的划分个数 { if(n<1 || m<1) return 0; if(n==1 || m==1) return 1; if(n<m) return q(n,n); if(n==m) return q(n,m-1)+1; return q(n,m-1)+q(n-m,m); } int main() { int n; while(cin>>n){ cout<<q(n,n)<<endl; } return 0; }
2)递归打表法:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=125;
__int64 f[NM][NM];
inline int q(int n,int m) //q(n,m):最大加数n1不大于m的划分个数
{
if(n<1 || m<1) return 0;
if(f
[m]) return f
[m];
if(n==1 || m==1) return f
[1]=f[1][m]=1;
if(n<m) return f
=q(n,n);
if(n==m) return f
[m]=q(n,m-1)+1;
f
[m-1]=q(n,m-1);f[n-m][m]=q(n-m,m);
return f
[m-1]+f[n-m][m];
}
int main()
{
int n;
while(cin>>n){
memset(f,0,sizeof(f));
cout<<q(n,n)<<endl;
}
return 0;
}
相关文章推荐
- 第二章 递归与分治策略(排列的字典序问题)
- 第二章 递归与分治策略
- 递归与分治策略
- 递归与分治策略
- 算法复习-递归与分治策略
- 算法源码之递归与分治策略(1)
- 递归与分治策略-2.9.1线性时间选择(随机划分基准)(第k小问题)
- 递归与分治策略
- 递归与分治策略-----合并排序
- 递归与分治策略
- 计算机算法设计与分析——递归与分治策略(二)
- 递归与分治策略
- 算法学习(一):递归与分治策略(1)
- 递归与分治策略
- 期末复习——递归与分治策略
- 《算法导论》第二章----插入排序(伪代码实现、课后习题(递归版本、二分查找策略版本))
- 递归与分治策略(1)
- 第2章 递归与分治策略,二分搜索技术(查找不成功时,返回区间位置)
- 递归与分治策略-2.6棋盘覆盖
- 递归与分治策略-2.1.4全排列