题目链接:https://www.luogu.com.cn/problem/P2386
题目大意:
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法)
解题思路:
搜索枚举所有方案,一个一个放。
我开 dfs(int id, int left)
,表示“当前正准备放第 id 个盘子,还剩余 left 个苹果没有放”的状态。
则:
如果当前 id == n
,说明存在一种方案。
否则,在第 id 个盘子放得时候要确保次方案合法,即,假设第 id 个盘子放得苹果的数量是 i :
i >= a[id-1]
或者i >= 0
(当 id==0 时)(n-id+1)*i <= left
(后面要都够放)
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 20;
int cnt, m, n, a[maxn], T;
void dfs(int id, int left) {
if (id == n) {
cnt ++;
return;
}
int st = (id == 1) ? 0 : a[id-1];
for (int i = st; (n-id+1)*i <= left; i ++) {
a[id] = i;
dfs(id+1, left-i);
}
}
int main() {
scanf("%d", &T);
while (T --) {
cnt = 0;
scanf("%d%d", &m, &n);
dfs(1, m);
printf("%d
", cnt);
}
return 0;
}