西安交大18年压轴题程序和测试用例:n个相同的小球,可以放入m个相同的盒子里,允许有空盒,问有多少种不同方法

这里有一个比较不错的博客,大家可以参考一下。https://blog.csdn.net/qq_32239767/article/details/80268218

我主要是描述怎么实现的,还有就是做测试用例,本人只穷举到7,也就是球的数目只是穷举到7个球,没有再穷举了。小伙伴在看的时候注意一下标红加粗的字段,这就是本思想的核心内容。本方法使用递归,目前还没想到递推或者循环的方法这样可以减少时空复杂度。

 

/********************* 程序分界线*************************************/

 

#include <iostream>
using namespace std;
int f(int m,int n);
int fun(int m,int n);
/*一下是测试用例
查看方法是:M表示球的数目,N表示箱子数目,SUM表示方法数据
在此举一个栗子:M=5 ,N=1,SUM=1,就是说5个球随机放到1个箱子里,只有1种可能
        M=6 ,N=2,SUM=4,就是说6个球随机放到3个箱子里,只有7种可能,
分别是:只把一个6个球放在一个一个箱子,也就是一个6;把一个箱子放1个球,一个箱子放5个球,也就是15;
    把一个箱子放2个球,一个箱子放4个球,也就是24;把一个箱子放3个球,一个箱子放3个球,也就是33;
    把一个箱子放1个球,一个箱子放1个球,一个箱子放4个球,也就是114;
    把一个箱子放1个球,一个箱子放2个球,一个箱子放3个球,也就是123;
    把一个箱子放2个球,一个箱子放2个球,一个箱子放2个球,也就是222;
M    N    sum                                                            
1    1    1                                                            
1    2    1                                                            
2    1    1    2                                                        
2    2    2    2    11                                                    
3    1    1    3                                                        
3    2    2    3    12                                                    
3    3    3    3    12    111                                                
4    1    1    4                                                        
4    2    3    4    13    22                                                
4    3    4    4    13    22    112    111                                        
5    1    5    5                                                        
5    2    3    5    14    23                                                
5    3    5    5    14    23    113    122                                        
5    4    6    5    114    23    113    122    1112                                    
5    5    7    5    114    23    113    122    1112    11111                                
6    1    1    6                                                        
6    2    4    6    15    24    33                                            
6    3    7    6    15    24    33    114    123    222                                
6    4    9    6    15    24    33    114    123    222    1113    1212                        
6    5    10    6    15    24    33    114    123    222    1113    1212    11112                    
6    6    11    6    15    24    33    114    123    222    1113    1212    11112    111111                
7    1    1    7                                                        
7    2    4    7    61    25    34                                            
7    3    8    7    61    25    34    115    124    133    223                            
7    4    11    7    61    25    34    115    124    133    223    1114    1123    1222                
7    5    13    7    61    25    34    115    124    133    223    1114    1123    1222    11113    11122        
7    6    14    7    61    25    34    115    124    133    223    1114    1123    1222    11113    11122    1111112    
7    7    15    7    61    25    34    115    124    133    223    1114    1123    1222    11113    11122    1111112    1111111
*/

/*
besign by :郑富荣
email     :986268320@qq.com
感谢      :非常感谢您的查阅,如果您在调试的时候出现问题可以联系宝宝哦!
*/

//这个函数是把M个球,随机放到N个箱子里面
//具体做法就是穷举,也就是把所有情况穷举出来,就是用for循环
//所有情况下的一个是把指定 M个球放到N个箱里,
//也就是说N个箱每个箱都最少有一个球,这个功能由int fun(int m,int n);完成
//把 1个 ,2个, ·····n个的情况相加
int f(int m,int n)
{
    int sum = 0;
    int i=1;
    if(n>m) n=m;
    if((m==1)||(n==1)) return 1;
    for(i=1;i<=n;++i)
        sum+=fun(m,i);
    return sum;
}

//也就是说N个箱每个箱都最少有一个球
//也就是说把M个球必须放到N个箱里
//第一步就是把M个球拿出N个放到N个箱里,每一个箱子一个
//第二部是把剩下的M-N个 随机放到N个箱子里
int fun(int m,int n)
{
    if((n==1)||(n==m))return 1;
    return  f(m-n,n);
}
int main()
{
    cout << "分配方法数目  = " <<f(7,7)<< endl;
    return 0;
}

/********************* 测试说明*************************************/

本程序在菜鸟教程的编辑器下编译,以下是截图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值