宝安设计网站建设,wordpress 百度站长,wordpress 网站关键词设置,logo在线设计生成免费N个小球放入M个盒子共有多少种方法#xff0c;并输出的算法设计#xff1a;算法思路1 #xff1a;暴力填充盒子每个小球都可能放入M个盒子的任意一个#xff0c;所以直接根据小球个数做递归即可,然后将存储放入hash中排重//TODO算法思路2 #xff1a;递归填充盒子即#…N个小球放入M个盒子共有多少种方法并输出的算法设计算法思路1 暴力填充盒子每个小球都可能放入M个盒子的任意一个所以直接根据小球个数做递归即可,然后将存储放入hash中排重//TODO算法思路2 递归填充盒子即每层递归仅考虑一个盒子放几个球剩下的球交给下一个递归。比如第一个盒子里放N个球则剩下的都是0个第一个盒子放n-1个球问题就变成了1个球与M-1个盒子的问题...直到第一个盒子放0个球问题变成了N个球与M个盒子的问题。递归的入口是第1个盒子那么递归的出口在哪自然是最后一个盒子。当盒子只剩一个时候便不向下递归还剩多少小球就全放进盒子里。递归伪代码如下public void everyBox(int boxes , int balls ,String oneResult ){if (boxes 1){ //递归出口thisResult oneResultballsreturn}for( iballs ; i 0 ; i -- ){thisResult oneResult (String) ieveryBox(boxes-1 , balls-i , thisResult) //递归}}算法2优化上述递归只有一个出口就是只剩一个box时候。不过这个程序还有一个可以优化的出口在balls等于0的时候。假设还剩余X个盒子没有进行递归而这时候剩余ball是0便不用递归了直接输出X个0即可。当盒子数小球数时候可以极大减少递归的层次提高代码效率。优化后的java示例代码如下由于要输出就直接systemout了public class NballMbox {public static void main(String[] args) {NballMbox nm new NballMbox();nm.iterator(4, 2, );}public void iterator(int balls , int boxes , String s){//ball 0 直接结算if(balls 0){for(int i 0 ;i boxes ;i)s s 0;System.out.println(s.toString());return;}for(int i balls;i 0;i--){String s1 si;if(boxes 1){System.out.println(s1.toString());return;}elsethis.iterator(balls-i, boxes-1, s1);}}}