zoukankan      html  css  js  c++  java
  • 洛谷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
    ", cnt);
        }
        return 0;
    }
    
  • 相关阅读:
    html语法规范
    html页面基本结构
    HTML头部结构详解
    文件路径中 / 和 ./ 和 ../的区别
    实体符号
    利用JS修改style属性和添加元素类名(important)
    Less
    Eureka自我保护计算
    Eureka元数据
    EurekaServer源码分析
  • 原文地址:https://www.cnblogs.com/quanjun/p/12240371.html
Copyright © 2011-2022 走看看