摘要: 上一篇讨论的是整数划分问题递归方法,下面来讨论下非递归方法:一般情况下,遇到递归问题,若能直接求得递推式,则可以很容易用数组模拟来实现递归,根据已经得出的递归关系,可以设置一个二维数组S[][]来存储数据:for(i=1;i<=n;i++){ S[i][1]=1; S[1][i]=1;}for(i=2;i<=n;i++){for(j=2;j<=m;j++){ i f(i==j)S[i][j]=1+S[i][i-1];else if(i<j)S[i][j]=S[i][i];elseS[i][j]=S[i-j][j]+S[i][j-1];}} 阅读全文
posted @ 2011-04-04 11:34 Matrix海子 阅读(1448) 评论(0) 推荐(0) 编辑
摘要: 整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,...,mi}为n的一个划分。如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)<=m,则称它属于n的一个m划分。这里我们记n的m划分的个数为f(n,m);例如但n=4时,他有5个划分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};注意4=1+3 和 4=3+1被认为是同一个划分。该问题是 阅读全文
posted @ 2011-04-04 10:57 Matrix海子 阅读(26536) 评论(6) 推荐(8) 编辑
摘要: pala提出的问题:十本不同的书放在书架上。现重新摆放,使每本书都不在原来放的位置。有几种摆法? 这个问题推广一下,就是错排问题: n个有序的元素应有n!种不同的排列。如若一个排列式的所有的元素都不在原来的位置上,则称这个排列为错排。 下面用递推的方法推导错排公式: 当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示,那么M(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推. 第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法; 第二步,放编号为k的元素,这时有两种情况.1,把它放到位置n,那么,对于剩下的n-... 阅读全文
posted @ 2011-04-04 10:45 Matrix海子 阅读(2511) 评论(0) 推荐(1) 编辑
摘要: C语言:char a = 'a';sizeof(char) = 1sizeof(a) = 1sizeof('a') = 4C++语言:char a = 'a';sizeof(char) = 1sizeof(a) = 1sizeof('a') = 1字符型变量是1字节这个没错,奇怪就奇怪在C语言认为'a'是4字节,而C++语言认为'a'是1字节。原因如下:C99标准的规定,'a'叫做整型字符常量(integer character constant),被看成是int型,所以在32位机器 阅读全文
posted @ 2011-04-04 10:41 Matrix海子 阅读(3684) 评论(2) 推荐(1) 编辑
摘要: 在谈述函数调用和返回值问题之前,先来看看C++中内存分配的问题。 C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量。数据区又分为静态数据区、动态数据区,动态数据区包括堆区和栈区。以下是各个区的作用:(1)代码区:存放程序代码;(2)数据区a.静态数据区: 在编译器进行编译的时候就为该变量分配的内存,存放在这个区的数据在程序全部执行结束后系统自动释放,生命周期贯穿于整个程序执行过程。b.动态数据区:包括堆区和栈区 堆区:这部分存储空间完全由程序员自己负责管理,它的分配和释放都由程序员自己负责。这个区是唯一一个可以由程. 阅读全文
posted @ 2011-04-04 10:13 Matrix海子 阅读(12371) 评论(3) 推荐(11) 编辑