
每日一题-dfs遍历
思路解析:
发布日期:2021-05-07 03:05:47
浏览次数:23
分类:精选文章
本文共 1420 字,大约阅读时间需要 4 分钟。
选择困难症
链接:https://ac.nowcoder.com/acm/problem/13594
来源:牛客网题目描述
小L有严重的选择困难症。 早上起床后,需要花很长时间决定今天穿什么出门。 假设一共有k类物品需要搭配选择,每类物品的个数为Ai,每个物品有一个喜欢值Vj,代表小L对这件物品的喜欢程度。 小L想知道,有多少种方案,使得选出来的总喜欢值>M 需要注意,每类物品,至多选择1件,可以不选。输入描述:
多组输入 每组数据第一行输入k M(k<=6,1<=M<=1e8),表示有多少类物品 接下来k行,每行以Ai(1<=Ai<=100)开头,表示这类物品有多少个,接下来Ai个数,第j个为Vj(1<=Vj<=1e8),表示小L对这类物品的第j个的喜欢值是多少。输出描述:
每组输出一行,表示方案数 示例1 输入 2 5 3 1 3 4 2 2 3 2 1 2 2 2 2 2 2 输出 3 8先贴源码:
#includeusing namespace std;typedef long long ll;const int maxn = 105;int a[7][maxn];//存储数据ll k,m,sum;int b[7];void dfs(int lev,int val){ if(val>m) { ll res = 1; for(int i=lev;i<=k;i++) { res *= (b[i]+1); } sum += res; return ; } if(lev>k) return;//层数超出限制 for(int i=0;i<=b[lev];i++) { dfs(lev+1,val+a[lev][i]); }}int main(){ while(cin>>k>>m) { sum = 0; for(int i=1;i<=k;i++) { cin>>b[i]; for(int j=1;j<=b[i];j++) { cin>>a[i][j]; } } dfs(1,0); cout< <<"\n"; } return 0;}
手写图解:

对于每类的数据,可以把它理解为树的每一层。
每层的树都要面临 b[i]+1 种选择,把它理解为每个节点的子节点。
因为每层(每类的物品)都要进行选择,要么选一个,要么不选,每类物品都是如此,所以就要dfs进行搜索,递归进行下去。
我对递归的一点理解:就是每次数据进行处理的步骤都是类似的,比如本题,每类的物品都要进行选择,就可以用递归来做。
本题对于dfs的终点的解读:
必须先判断累加的值是否大于给定的m,因为如果先判断是否出界,最后一类物品可能满足取的价值和已经大于m,但是因为先判断出界而没有算上最后一类物品导致少算。感兴趣可关注公众号领取大量资料。

发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月16日 03时52分59秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux 磁盘管理(df fu fdisk mkfs mount)
2021-05-09
jQuery的事件绑定与触发 - 学习笔记
2021-05-09
Linux上TCP的几个内核参数调优
2021-05-09
记一次讲故事机器人的开发-我有故事,让机器人来读
2021-05-09
seo 回忆录百度基本概念(一)
2021-05-09
netcore中使用session
2021-05-09
Android 开发学习进程0.25 自定义控件
2021-05-09
多媒体文件格式全解说(下)--图片
2021-05-09
淘宝WAP版小BUG分析
2021-05-09
asp.net打印网页后自动关闭网页【无需插件】
2021-05-09
【Maven】POM基本概念
2021-05-09
【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
2021-05-09
【设计模式】单例模式
2021-05-09
远程触发Jenkins的Pipeline任务的并发问题处理
2021-05-09
entity framework core在独立类库下执行迁移操作
2021-05-09
Asp.Net Core 2.1+的视图缓存(响应缓存)
2021-05-09
【wp】HWS计划2021硬件安全冬令营线上选拔赛
2021-05-09
Ef+T4模板实现代码快速生成器
2021-05-09
JQuery选择器
2021-05-09