把M个不同的桔子放在N个同样的盘子里,不允许有的盘子空着不放,问共有多少种不同的分法?

把M个不同的桔子放在N个同样的盘子里,不允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)
不允许有空盘不放


我们可以发现此题是一个组合数问题,那么就直接搜索:

#include <iostream>
#include <iomanip>
using namespace std;

int a[30], n, m, tmp = 0;
void dfs(int step){
    if (step == n + 1){
        if (tmp != m) return;
        for (int i = 1; i <= m; i++)
        {
            cout << setw(3) << a[i]; 
        }
        cout << '\n';
        return;
    }
    a[++tmp] = step;
    dfs(step + 1); 
    --tmp;
    dfs(step + 1);
}

int main(){
    cin >> n >> m;
    dfs(1);
    return 0;
}

假设M=7,N=3,且5 1 1 和 1 5 1设为同样的分法,解题如下

def juzi_divide(m,n):
if m == 0 or n == 1 :
#如果,碟子只有1个,无论橘子有多少个都只有一种放法
return 1
if n > m : #如果,碟子的个数大于苹果的个数
return juzi_divide(m,m)
else :
return juzi_divide(m,n-1) + juzi_divide(m-n,n)

if name=='__main__' :
result = juzi_divide(7,3)
print(result)