算法类思考累积(一)

来源:互联网 发布:动态pe和静态pe 知乎 编辑:程序博客网 时间:2024/05/19 21:17

最近心情比较郁闷,然后我其实在算法方面是绝对的短脚,所以也得累积一下,那么这此就来写一个关于算法类的好了

当然也是网上看到了博客然后进行思考理解的,不是我自己想出来的,理解了之后也算是大有收获,开阔思路

参考的文章:http://blog.csdn.net/jason0539/article/details/12183817


题目:

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。


那么首先我们就是要进行分析了,这个分法我们要如何去分块,这里的话其实一般来说就四种情况

(1)M==0或M==1这种时候不管有多少个盘子,我们永远只有一种放法,这种的前提是不能有苹果留在手里不放

(2)N==1这种时候不管有多少个苹果,都只能放在一个盘子里,也是只有一种放法,当然,N==0时也一样

(3)M>=N这种时候是我们需要主要计算有多少种分法的一种情况

(4)M<N这种时候也是我们主要需要分析的一种情况



首先是(3)这种分法,此时苹果M多于等于盘子N,那么这种情况下可以思考到

这种分法时,主要分两块

1、所有的盘子都有苹果即:f(m,n) = f(m-n,n)

这个等式的得到实际上就是,如果每个盘子都有苹果,那么实际上把每个盘子都减去一个苹果时得到的分配方法数量是一样的,那就是跟苹果数量减去盘子数量后分配的次数是一样的,即:

f(m,n) = f(m-n,n)

2、一个以及以上盘子空着的情况:f(m,n) = f(m,n-1)

这个等式可能很多人会觉得不理解,其实我自己也是没有马上就理解,这里首先要对f(m,n)这个方法有个准确的定义,这个方法的结果就是我们想要的分配的总数结果,只是现在是未知数而已,所以其实现在这个 f(m,n-1)的答案就是当少一个盘子时的分配的数量,即:

f(m,n) = f(m,n-1)

然而,上面两个等式都是限制了情况底下才会相等,如果将上面两块拼起来,那就是完整的f(m,n)了,故得出

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

答案 = 每个盘子都有苹果的分配数量 + 至少一个盘子空着的分配数量


其次是(4)这种情况:此时苹果少于盘子,那么这种情况下可以思考到:

1、由于5,1,1和1,5,1 是同一种分法,所以其实:f(m,n) = f(m,m)

这种情况下就比较简单了,当苹果数量少于盘子数量,那么和苹果的数量和盘子的数量一样多时的结果是一样的,即:

f(m,n) = f(m,m)


那么当情况都区分出来之后,就得到了:

  1. static int fun(int m, int n) // m个苹果放在n个盘子中共有几种方法  
  2.     {  
  3.         if (m == 0 || n == 1// 因为我们总是让m>=n来求解的,所以m-n>=0,所以让m=0时候结束,如果改为m=1,  
  4.             return 1// 则可能出现m-n=0的情况从而不能得到正确解  
  5.         if (n > m)  
  6.             return fun(m, m);  
  7.         else  
  8.             return fun(m, n - 1) + fun(m - n, n);  
  9.     }  

通过这个方法,就可以得到正确的结果了,我本地也已经进行测试验证过了,其实这个方法的数据,最后都是到了m==0 || n == 1得到的数字1层层递归上去

而得到最终结果的,我本身也在代码中进行了输出验证过了,在这里就不将输出放出了





0 0
原创粉丝点击