第二章 递归与分治策略

来源:互联网 发布:电气工程师难考吗 知乎 编辑:程序博客网 时间:2024/06/01 17:15

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[n][m]) return f[n][m];if(n==1 || m==1) return f[n][1]=f[1][m]=1;if(n<m) return f[n][n]=q(n,n);if(n==m) return f[n][m]=q(n,m-1)+1;f[n][m-1]=q(n,m-1);f[n-m][m]=q(n-m,m);return f[n][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;}



0 0
原创粉丝点击