这个题理解了好大会才理解,看了网上的代码,不太理解,但是后来看了好几个人的, 大同小异吧,慢慢的就理解了。

思路:

递归函数的意思是, 将 n 划分为最大数为 m 的划分数, 可以分几种情况

1. 当n = 1 的时候, 这时候就是将1划分, 也就是递归的出口, 1 肯定只能划分为 1, 所以返回1

2. 当m = 1的时候, 最大的数为1, 所以只能全划分为1才行, 所以就一种,return 1;

3. 当n < m的时候, 一个数肯定不能划分为比他要大的数, 最大只能划分到它本身,所以只需要将m变成n就行了,所以func(n, n);

4. 当n > m 时,根据划分中是否包含最大值 m,可以分为两种情况:

(a). 划分中包含 m 的情况,即 { m, { x1, x2, ..., xi } }, 其中 { x1, x2, ..., xi } 的和为 n - m,可能再次出现 m,因此是(n - m)的 m 划分,因此这种划分

个数为 f(n-m, m);

(b). 划分中不包含 m 的情况,则划分中所有值都比 m 小,即 n 的 ( m - 1 ) 划分,个数为 f(n, m - 1);

因此 f(n, m) = f(n - m, m) + f(n, m - 1);

5.  当 n = m 时,根据划分中是否包含 n,可以分为两种情况:

(a). 划分中包含n的情况,只有一个即 { n };

(b). 划分中不包含n的情况,这时划分中最大的数字也一定比 n 小,即 n 的所有 ( n - 1 ) 划分。

因此 f(n, n) = 1 + f(n, n-1);

大体思路就是这样,不理解的话可以尝试着代入数据试试,理解理解大体概念,下面是代码的实现:

方法一(递归版):

 #include <stdio.h>

 int func(int n, int m)//func(n, m) 是将 n 划分为最大数不超过m的划分
{
if(n == || m == )
return ;
if(n < m)//因为不可能将n划分成比n还大的数,所以,直接m = n就行了
return func(n, n);
else if(n > m)/*当将n划分为比它小的数时,
一个是继续往下再找一个,还有一个就是剩下的那个*/
return func(n, m - ) + func(n - m, m);
else if(n == m)//n = m的时候, 也就是它的上一个的划分加上1
return + func(n, m - );
}
int main()
{
int m;
scanf("%d", &m);
for(int i = ; i < m; i++)
{
int n;
scanf("%d", &n);
printf("%d\n", func(n, n));
}
return ;
}

方法二(dp):

 //dp
#include <stdio.h> const int MAX = ; int main()
{
int dp[MAX + ][MAX + ];
for(int i = ; i <= MAX; i++)
dp[i][] = dp[][i] = ;//初始化
for(int i = ; i <= MAX; i++)
{
for(int j = ; j <= MAX; j++)
{
if(i == j)
dp[i][i] = dp[i][i - ] + ;
else if(i < j)
dp[i][j] = dp[i][i];
else
dp[i][j] = dp[i][j - ] + dp[i - j][j];
}
}
int m, t;
scanf("%d", &m);
for(int i = ; i < m; i++)
{
scanf("%d", &t);
printf("%d\n", dp[t][t]);
}
return ;
}

最新文章

  1. sikuli运行出现问题:Win32Util.dll: Can&#39;t load 32-bit .dll on a AMD 64 bit platform
  2. plsql developer 使用技巧
  3. p-value
  4. MessagePack for C#
  5. sql server导出数据,本地数据库远程连接不上,怎样设置防火墙(自用)
  6. HTML学习感悟
  7. 简单易懂的程序语言入门小册子(5):基于文本替换的解释器,递归,不动点,fix表达式,letrec表达式
  8. 使用JfreeChart生成图表遇到的问题
  9. [leetcode]13. Roman to Integer罗马数字转整数
  10. [转]Qt 之 QFileSystemWatcher
  11. idea关于热部署插件JRebel的使用教程
  12. LG2516 【[HAOI2010]最长公共子序列】
  13. 铺音out2
  14. 手把手教你测微信小程序
  15. hdu 5137 去掉一个点 使得最短路最大(2014广州现场赛 K题)
  16. ExtJs动态生成复选框
  17. Python爬虫基础(三)urllib2库的高级使用
  18. WPF中Style文件引用另一个Style文件中的样式
  19. 写了个汉字转G代码工具,无描边的那种,市面上没有类似的小软件
  20. hibernate的多对多配置

热门文章

  1. codevs 1139 观光公交
  2. MySQL 缓存 Query Cache
  3. (转)你知道Android也有安全模式吗?(地球人都知道了吧)
  4. MyBatis学习笔记(2)——缓存
  5. OOCSS学习(一)
  6. Qt:截图工具,任意大小矩形截图、全屏截图
  7. RR 和RC 幻读问题
  8. 常用SNS开源系统比较
  9. 【转】Android Studio安装配置学习教程指南 下载和安装--不错
  10. Android中bitmap的相关处理