洛谷P2386 放苹果 题解 搜索入门

题目链接: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\n", cnt);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/quanjun/p/12240371.html