P2386 放苹果

洛谷P2386放苹果 【问题描述】 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 【输入】 第一行是测试数据的数目t(0 【输出】 对输入的每组数据M和N,用一行输出相应的K。 【问题分析】 放苹果的问题乍看之下很复杂,盘子是一样的,苹果也是一样的;只要每个盘子里面放的苹果是一样多的,不管顺序如何最终得 阅读详情

记录163

#include<bits/stdc++.h> // 引入万能头文件,包含所有常用的标准库
using namespace std; // 使用标准命名空间
int t,m,n; // 定义全局变量t(测试数据组数)、m(苹果数)、n(盘子数)
int ans; // 定义全局变量ans,用来记录当前测试数据的合法方案总数

// remain_apple: 当前还剩下多少个苹果没放
// remain_plate: 当前还剩下多少个盘子没放
// min_apple: 当前这个盘子至少要放多少个苹果(保证非递减,避免重复)
void dfs(int remain_apple,int remain_plate,int min_apple){
    // 如果只剩下最后1个盘子,剩下的苹果全部放进去,这算作一种合法方案
    if(remain_plate==1){
        ans++; // 方案数加1
        return; // 结束当前递归分支
    }
    
    // 枚举当前盘子放多少个苹果(从min_apple开始枚举)
    // 剪枝:因为后面还有remain_plate-1个盘子,且每个至少放i个
    // 所以当前最多只能放 remain_apple / remain_plate 个
    for(int i=min_apple;i<=remain_apple/remain_plate;i++){
        dfs(remain_apple-i,remain_plate-1,i); // 递归搜索下一个盘子,传入减去i后的剩余苹果,盘子数减1,最小可选值更新为i
    }
}

int main(){ // 主函数入口
    ios::sync_with_stdio(false); // 关闭cin与stdio的同步,加快输入输出速度
    cin.tie(0); // 解除cin与cout的绑定,进一步加快IO效率
    cin>>t; // 输入测试数据的组数t
    while(t--){ // 循环t次,处理每一组测试数据
        cin>>m>>n; // 输入当前组的苹果数m和盘子数n
        ans=0; // 每次测试数据开始前,将方案数清零
        dfs(m,n,0); // 调用dfs开始搜索,初始剩余m个苹果,需放n个盘子,最小从0开始选(允许空盘)
        cout<<ans<<"\n"; // 输出当前测试数据的合法方案总数
    }
    return 0; // 主函数正常结束,返回0
}

题目传送门https://www.luogu.com.cn/problem/P2386


前言

我是一名专注信奥赛(GESP、CSP-J/S)的教练。

  • 如果你觉得这篇题解对你有帮助,欢迎点击关注我的优快云账号,我会持续更新高质量算法解析。
  • 我深知算法思维的构建远比单纯通过题目更重要,本系列题解不局限于AC代码的堆砌,而是致力于拆解题目背后的逻辑链条与核心知识点
  • 备赛路上若遇瓶颈,欢迎随时评论或私信,我将甄选典型疑难问题,通过视频讲解或撰写专项文章的形式,为你提供深度答疑。

核心解题思路

这道题是一道非常经典的组合数学与深度优先搜索(DFS)剪枝问题。

  1. 问题转化(非递减序列模型):
    题目要求将 mm 个相同的苹果放入 n 个相同的盘子,且允许空盘。因为盘子是相同的,所以 (5,1,1) 和 (1,1,5) 被视为同一种方案。为了避免重复计数,我们可以强制规定每个盘子放的苹果数量呈非递减顺序(即前一个盘子放的苹果数 ≤≤ 后一个盘子放的苹果数)。这样,每一种合法的分配方案都唯一对应一个非递减序列。

  2. 算法设计(DFS 与剪枝优化):
    我们可以使用 DFS 逐个盘子进行分配。在搜索过程中,需要维护三个状态:剩余苹果数、剩余盘子数、以及当前盘子至少需要放的苹果数(即上一个盘子放的苹果数,保证非递减)。

    • 边界条件:当剩余盘子数为 1 时,说明前面的盘子都已经分配完毕,剩下的苹果必须全部放入最后一个盘子。由于是非递减序列,只要前面的分配合法,最后一步必然合法,直接方案数加 1 并返回。
    • 枚举与剪枝:对于当前盘子,枚举放入的苹果数 i 。下界是 min_apple,上界则是通过平均值剪枝得出的:为了保证剩下的盘子也能满足非递减条件,当前盘子最多只能放 remain_apple / remain_plate 个苹果。这极大地减少了搜索树的规模。

 代码分块详细解释

1. 全局变量与函数签名定义

#include<bits/stdc++.h> 
using namespace std; 
int t, m, n; // 定义全局变量t(测试数据组数)、m(苹果数)、n(盘子数)
int ans; // 定义全局变量ans,用来记录当前测试数据的合法方案总数

// remain_apple: 当前还剩下多少个苹果没放
// remain_plate: 当前还剩下多少个盘子没放
// min_apple: 当前这个盘子至少要放多少个苹果(保证非递减,避免重复)
void dfs(int remain_apple, int remain_plate, int min_apple){
  • 详细分析:定义了三个全局变量用于主循环控制。dfs 函数是核心搜索函数,参数设计非常精妙:min_apple 参数完美地解决了“盘子相同导致方案重复”的问题,它充当了当前枚举的下界,强制后续的分配不会小于之前的分配。

2. 核心逻辑:边界处理与剪枝枚举

    // 如果只剩下最后1个盘子,剩下的苹果全部放进去,这算作一种合法方案
    if(remain_plate == 1){
        ans++; // 方案数加1
        return; // 结束当前递归分支
    }
    
    // 枚举当前盘子放多少个苹果(从min_apple开始枚举)
    // 剪枝:因为后面还有remain_plate-1个盘子,且每个至少放i个
    // 所以当前最多只能放 remain_apple / remain_plate 个
    for(int i = min_apple; i <= remain_apple / remain_plate; i++){
        dfs(remain_apple - i, remain_plate - 1, i); // 递归搜索下一个盘子
    }
}
  • 详细分析:
    • 边界处理:当 remain_plate == 1 时,意味着只剩下一个盘子,此时无论剩下多少苹果,都只能全放进去。由于我们一直在维护非递减序列,只要前面的分配合法,最后一步必然合法,因此直接 ans++ 并返回。
    • 循环与剪枝:for 循环的下界是 min_apple,保证了非递减;上界是 remain_apple / remain_plate,这是极其关键的平均值剪枝。假设还剩 10 个苹果和 4 个盘子,当前盘子最多只能放 10/4=210/4=2 个,因为如果放 3 个,剩下的 7 个苹果分给 3 个盘子,平均值大于 2,必然违反非递减规则。这个剪枝将时间复杂度大幅降低。

3. 主函数:多组数据测试与状态重置

int main(){ 
    ios::sync_with_stdio(false); 
    cin.tie(0); 
    cin >> t; 
    while(t--){ 
        cin >> m >> n; 
        ans = 0; // 每次测试数据开始前,将方案数清零
        dfs(m, n, 0); // 调用dfs开始搜索,初始剩余m个苹果,需放n个盘子,最小从0开始选(允许空盘)
        cout << ans << "\n"; 
    }
    return 0; 
}
  • 详细分析:主函数处理多组测试数据。每次调用 dfs 前,必须将全局变量 ans 重置为 0。初始调用时,min_apple 传入 0,完美契合了题目中“允许有的盘子空着不放”的条件。

核心逻辑总结

代码模块核心变量/操作精炼作用解决的痛点
非递减约束min_apple 参数传递记录上一个盘子放的苹果数,作为当前枚举下界完美解决了“盘子相同导致 (5,1,1) 和 (1,1,5) 重复计数”的痛点
边界快速返回if(remain_plate == 1)仅剩一个盘子时直接累加方案数避免了无意义的深层递归,提升了搜索效率
平均值剪枝i <= remain_apple / remain_plate限制当前盘子能放苹果的最大值极大地缩减了搜索树的规模,防止超时
状态重置ans = 0每组测试数据开始前清零计数器保证多组测试数据之间的独立性,防止答案污染
允许空盘初始调用 dfs(m, n, 0)将初始最小苹果数设为 0满足了题目中“允许有的盘子空着不放”的特殊要求
Synopsys工具filter命令:从数据筛选到高效IC设计的实战指南 在数字集成电路设计流程中,数据筛选与查询是工程师处理海量网表、时序报告和设计约束的核心需求。其原理在于通过声明式查询语言,直接对设计对象(如单元、网络、路径)的属性进行逻辑判断与模式匹配,从而精准定位目标。这种技术价值在于将工程师从繁琐的过程式脚本循环中解放出来,大幅提升代码可读性与运行效率,直接调用工具内置的高性能查询引擎。在实际应用场景中,它广泛用于物理与时序联合分析、层次化模块操作、动态约束生成以及自动化报告生成。本文聚焦于Synopsys工具链中filter命令的高阶用法,深入解析其表达式语法、正则 阅读详情

相关推荐

电子取证之服务器取证思路

服务器取证是一个技术性很强的领域,涉及到多个环节,包括网站重构、网站代码分析、容器分析等。数据库密码的获取通常通过查看配置文件、日志文件、备份等途径,同时可以通过一些绕过技术如禁用身份验证来获取权限。对于不同的数据库,需要根据其特性采取相应的应对方法和命令。

2401_84830066的博客 2489

洛谷P2386 - 放苹果

题目描述 P2386 放苹果 解法:DP(C++) 记 dp[i][j]dp[i][j]dp[i][j] 表示 iii 个盘子 jjj 个苹果时的方法数,初始时 dp[0][0]=1dp[0][0]=1dp[0][0]=1 转移方程 如果盘子的数量大于苹果的数量,那么空盘子其实是没有意义的,也就是 dp[i][j]=dp[i][i]dp[i][j]=dp[i][i]dp[i][j]=dp[i][i] 反之,分两种情况: #include <bits/stdc++.h> using namesp

Aries_young的博客 704

【Matlab 传感器布局优化】基于群智能算法的wsn覆盖优化研究

本文主要是对同构和异构传感器在指定空间内的布局进行优化,以最大覆盖率为目标,使用了DBO/SCA/WOA/SSA/NOA等启发式算法,在100x100的空间内,对30,100,200个传感器进行优化,得到最优的布局位置和对应覆盖率。

u013367499的博客 1818

洛谷P2386 放苹果

洛谷P2386 放苹果 洛谷P1025 数的划分 这道题跟数的划分差不多,这里给一个链接,讲得很好! 放苹果

tangzhide123yy的博客 329

未来智能家居解决方案:AI应用架构师的前沿探索

当你加班到深夜回家时,门锁自动识别你的脚步声解锁,玄关灯渐亮成你最爱的暖光,空调早已调到25℃(你夏天的习惯温度),音箱播放着最近循环的爵士乐,茶几上的智能水壶烧好了温水——这不是科幻电影,而是未来智能家居的日常。如何让“冰冷的设备”变成“懂你的伙伴”。我们将深入探讨五大前沿技术(边缘AI、多模态融合、联邦学习、数字孪生、个性化推荐)的底层原理,用“家里的小管家”“邻居互相学习”等生活化比喻简化复杂概念,结合代码示例与架构图还原实现流程,并通过智能卧室、智能厨房等真实案例展示落地路径。

AI天才研究院 1410

Docker部署 SRS rtmp/flv流媒体服务器

SRS(Simple Realtime Server)是一款开源的流媒体服务器,具有高性能、高可靠性、高灵活性的特点,能够支持直播、点播、转码等多种流媒体应用场景。SRS 不仅提供了流媒体服务器,还提供了适用于多种平台的客户端 SDK 和在线转码等辅助服务,是一款十分强大的流媒体解决方案。

m0_56659620的博客 4869

【C++ 真题】P2386 放苹果

把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法。511和115是同一种方法)

Ω 725

【android bluetooth 案例分析 01】【HiCar 详解 3】【hicar时如何交换Wifi参数的】

如果直接使用 L2CAP(不经过 RFCOMM),会需要额外的协议来保证可靠性,而 RFCOMM 天然支持。BLE 广播的数据长度受限(31 字节 / 255 字节扩展),不适合传输复杂的 Wi-Fi 连接参数。使用 RFCOMM 传输参数,可以兼容不同厂商的车机和手机,而无需依赖特殊的蓝牙功能。手机解析这些参数,并使用 Wi-Fi Direct 连接到车机。,然后才能让 Wi-Fi Direct 进行真正的数据传输。,适合传输 Wi-Fi 连接参数等关键数据。,可以安全地交换 Wi-Fi 连接信息。

奔跑吧 android 的博客 1740

洛谷P2386 放苹果 数学 记忆化搜索

洛谷P2386 放苹果 数学 记忆化搜索 题意 将 n个球放入 k个 盒子中,允许有空盒子, 且 方案 1,1,5 和 5,1,1, 属于重复的 1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring&gt...

weixin_34365417的博客 193

告警不是闹钟:AI 如何把告警过滤成真正的“求救信号”?

告警不是闹钟:AI 如何把告警过滤成真正的“求救信号”?

Echo_Wish 241

Yocto系列讲解[入门篇] 1 - 快速入门熟悉Yocto的构建

yocto quick start up带大家快速上手

fulinux的博客 5万+

洛谷 P2386 放苹果

P2386 放苹果 题目背景 (poj1664) 题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法) 输入输出格式 输入格式: 第一行是测试数据的数目t(0 <= t <= 20),以下每行均包括二个整数M和N,以空格分开。1<=M,N<=10 ...

HJ921004的博客 175

机器学习之多种算法优缺点总结及优化方法

一、无监督算法: 1、聚类算法:Kmeans 2、关联规则算法:Apriori 二、有监督算法 1、分类算法 决策树(Decision Tree) 支持向量机(SVM) K近邻(kNN,k-NearestNeighbor) 朴素贝叶斯 逻辑回归 2、回归算法 线性回归 多项式回归 3、集成算法 a、bagging(Bootstrapped Aggregation) 随机森林 ...

平原的博客 7081

洛谷 P2386 放苹果 C语言

爆搜,按照字典序大小不是必须的,但是这样不好遗漏或者说重复倒置逻辑混乱,所以我们可以使用一个start来使得i枚举的数字是大于等于上一层递归的数字,接着使用m-sum,表示剩余的苹果数量,这个如果数据小的话写m也可以。把 mm 个同样的苹果放在 n 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法。(5,1,1 和 1,1,5是同一种方法)第一行是测试数据的数目 t,以下每行均包括二个整数 m 和 n,以空格分开。对于所有数据,保证:1≤m,n≤10,0≤t≤20。

zqystca的博客 643

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

洛谷——P2386 放苹果

https://www.luogu.org/problem/show?pid=2386 题目背景 (poj1664) 题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法) 输入输出格式 输入格式: 第一行是测试数据的数目t(0 <= t <= 20),以下每行均包括二个整数M和N...

agcozdwdfvds08078的博客 226

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

P2386 放苹果 方法一

http://noi.openjudge.cn/ch0203/666/ /* 2.3基本算法之递归变递推_666放苹果 方法一 http://noi.openjudge.cn/ch0203/666/ 1192:放苹果 http://ybt.ssoier.cn:8088/problem_show.php?pid=1192 */ #include<iostream> #include<cstring> using namespace std; int a[20][20]; int

青少年趣味编程 458

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

P2386 放苹果(洛古)

把m​个同样的苹果放在n​个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法。511​和115​是同一种方法)

小芒果的博客 216

洛谷·P2386 放苹果

这道题说实话不难,但是我不知道怎么搞的,一开始脑子一片空白。。我完了。。 我用的这种方法非常奇葩,大佬勿喷~ 其实就是递归啦,我们上课老师讲了这道题,但是那时候没做,昨天有时间就做了。 没想到一下子就AC了! 这题确实有很多方法都可以用:搜索(DFS和BFS都可)、递归、递推都可。 下面请看代码: #include #include #include //以防万

qq_39906776的博客 628
上一篇: P13555 【MX-X15-T2】系绳绳
下一篇: P1025 [NOIP 2001 提高组] 数的划分
谢天谢地AC了 | 信奥教练
博客等级 码龄1年 53粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值