您的位置:首页 > 其它

第二章 递归与分治策略

2014-04-08 14:55 148 查看
2-5 整数划分问题

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: