我们用递归+记忆化的方法来解决普通整数划分问题:定义 f(n,m)为将整数n划分为一系列整数之和,其中加数

最大不超过m。

得到下面的递推关系式:

当n==1 || m==1 只有一种划分,即 1 或者 1+1+1......+1

当m>n 显然,等价于 f(n,n)

当m==n 此时:我考虑加数包含m与否的两种情况:

1)划分不包含m,即f(n,m-1)---所有m-1的划分

2)划分包含 m,此时只有一种即 m

所以当m==n时,有 f(n,m)=f(n,m-1)+1

当m<n时,

1)包含m时,{m,x1,x2,x3....xi}此时 等价于 f(n-m,m)

2)不包含m时,显然f(n,m-1)

所以f(n,m)=f(n,m-1)+f(n-m,m)

采用记忆化技术优化复杂度:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 130
int num[MAXN][MAXN];
int dp(int n,int k)
{
if(n==||k==)
return ;
if(k>n)
{
k=n;
if(num[n][n]==-)
return num[n][n]=dp(n,n);
else
return num[n][n];
}
else if(k==n)
{
if(num[n][k]==-)
return num[n][k]=dp(n,k-)+;
else
return num[n][k];
}
else
{
if(num[n][k]==-)
return num[n][k]=dp(n,k-)+dp(n-k,k);
else
return num[n][k];
}
}
int main()
{
int n;
while(cin>>n)
{
memset(num,-,sizeof(num));
cout<<dp(n,n)<<endl;
}
return ;
}

最新文章

  1. jira操作
  2. centos install zookeeper cluster
  3. 搭建openvpn 未完成。。。
  4. android之OptionsMenu
  5. DataGridView减少闪烁的解决办法
  6. 关于将客户端移植到Lua的解决方案设想。
  7. Mysql优化之创建高性能索引(二)
  8. Swift 求余运算
  9. 手机访问pc地址时直接跳到移动端
  10. Extjs中数据导出到Excel
  11. 注解 - Excel 校验工具
  12. (Dijkstra) POJ2387 Til the Cows Come Home
  13. Java Deque 队列 栈
  14. BASEDIR
  15. android_双击退出
  16. day_6.6 py
  17. 记一次挂马清除经历:处理一个利用thinkphp5远程代码执行漏洞挖矿的木马
  18. 008-jdk1.7版本新特性
  19. PHPEmailer使用简介(以qq邮箱为例)
  20. beta冲刺(6/7)

热门文章

  1. java.lang.String中的trim()方法的详细说明(转)
  2. mysql的安装、C++訪问mysql数据库、编码设置问题
  3. 一个IP绑定多个域名
  4. iterm2 配色
  5. C语言-回溯例4
  6. android中的MD5、Base64、DES/3DES/ADES加解密
  7. ruby on rails模拟HTTP请求错误发生:end of file reached
  8. hdu5317 RGCDQ 统计
  9. Graphics and Animation in iOS
  10. 2251: [2010Beijing Wc]外星联络