幸运的袋子(深度优先遍历(Depth First Search,DFS))
题目描述
一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。
例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。输入描述:第一行输入一个正整数n(n ≤ 1000) 第二行为n个数正整数xi(xi ≤ 1000)输出描述:输出可以产生的幸运的袋子数
输入
3
1 1 1
输出
2
分析
这道题涉及深度优先遍历。
对于任意两个正整数a,b如果满足 a+b>a*b,则必有一个数为1.可用数论证明: 设a=1+x,b=1+y,则1+x+1+y>(1+x)*(1+y),---> 1>x*y,则x,y必有一个为0,即a,b有一个为1. 推广到任意k个正整数,假设a1,a2,...ak,如果不满足给定条件,即和sum小于等于积pi, 如果此时再选择一个数b,能使其满足sum+b > pi*b,则,b必然为1,且为必要非充分条件。 反之,如果选择的b>1,则sum+b <=pi*b,即a1,a2,...,ak,b不满足给定条件。(搜索剪枝的重要依据) 因此,将球按标号升序排序 ,每次从小到大选择,当选择到a1,a2,...,ak-1时满足给定条件,而再增加选择ak时不满足条件(ak必然大于等于max(a1,a2,...,ak-1)),继续向后选择更大的数,必然无法满足。因此,可以进行剪枝。如果有多个1,即当k=1时,sum(1)>pi(1)不满足,但下一个元素仍为1,则可以满足1+1>1*1,所以要判断当前ak是否等于1。此外,对于重复数字,要去重复。
def getNum(array,Sum,multi):count = 0for i in range(len(array)):if i > 0 and array[i] == array[i-1]:continueSum += array[i]multi *= array[i]if Sum > multi:count += 1+getNum(array[i+1:],Sum,multi)elif array[i] == 1:count += getNum(array[i+1:],Sum,multi)else:breakSum -= array[i]multi /= array[i]return countn = input() x = list(map(int,input().strip().split())) x.sort() Sum = 0 multi = 1 print(getNum(x,Sum,multi))
转载于:https://www.cnblogs.com/Peyton-Li/p/7587372.html
幸运的袋子(深度优先遍历(Depth First Search,DFS))相关推荐
- 深度优先遍历(Depth First Search, 简称 DFS)
正文开始: 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷 ...
- 华为机试HJ41:称砝码(深度优先遍历dfs-Depth First Search)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 现有一组砝码,重量互不相等,分别为m1,m2,m3-mn: 每种砝码对应的数量为x1 ...
- 深度优先搜索(Depth First Search)、广度优先搜索(Breadth First Search)
DFS: /* 邻接表存储的图 - DFS */void Visit( Vertex V ) {printf("正在访问顶点%d\n", V); }/* Visited[]为全局变 ...
- Python二叉树的三种深度优先遍历
Python二叉树的三种深度优先遍历 一.广度优先遍历和深度优先遍历 对二叉树进行遍历(traversal)是指依次对树中每个节点进行访问,在遍历的过程中实现需要的业务. 对树的遍历方式有广度优先遍历 ...
- 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)
图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) 阅读本文前,请确保你已经掌握了递归.栈和队列的基本知识,如想掌握搜索的代码实现,请确保你能够用代码实现栈和队列的基本操作. 深度优先遍 ...
- 深度优先遍历(DFS)和广度优先遍历(BFS)
深度优先遍历(DFS)和广度优先遍历(BFS) 图的遍历:所谓遍历,即是对结点的访问.一个图有多个结点,如何遍历这些结点,有两种访问策略: 深度优先遍历(Depth First Search, 简称 ...
- Python实现深度优先遍历(DFS)和广度优先遍历(BFS)
一,简介 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫 ...
- DFS(Depth First Search,深度优先搜索)与BFS(Breadth First Search,广度优先搜索)总结与思考
目录 Depth First Search(dfs) 代码(递归) 代码(非递归) Breadth First Search(bfs) 代码 比较 数据结构 时间复杂度 使用 例题:岛的个数 dfs实 ...
- 数据结构-深度优先遍历和广度优先遍历(漫画)
----- 第二天 ----- ------------ 什么是 深度/广度 优先遍历? 深度优先遍历简称DFS(Depth First Search),广度优先遍历简称BFS(Breadth F ...
- 【图数据结构的遍历】java实现广度优先和深度优先遍历
[图数据结构的遍历]java实现广度优先和深度优先遍历 宽度优先搜索(BFS)遍历图需要使用队列queue数据结构: 深度优先搜索(DFS, Depth First Search)的实现 需要使用到栈 ...
最新文章
- java公平所与非公平所_一张图读懂Java非公平锁与公平锁
- Windows Servers双网卡绑定并配置IP地址
- Redis和Memcache对比及选择
- 用CSS3来添加项目编号
- 如何高效的比较两个 Object 对象是否相等?
- 自定义计算器 android,自定义公式计算app下载
- C#LeetCode刷题之#561-数组拆分 I(Array Partition I)
- 计算机调试员高级理论知识试卷,电子计算机设备调试员(高级)考核复习题—理论试题.doc...
- Linux下Eclipse给工程配置(附加库目录)
- 计算机中那些事儿(二):如何神操作你的电脑
- 2018年EMUI系统能力分论坛来啦
- 【CarMaker学习笔记】CarMaker Python API 接口使用方法
- java嵌入式软件开发工程师_嵌入式软件工程师笔试题
- 基于bp神经网络的房价预测,房价预测 神经网络
- 微信小程序弹框(组件)
- python数据挖掘学习路线图
- 数据分析必备的五大能力
- C# int和byte[]之间的互转
- movie计算机英语作文,my favorite movie英语作文100字
- ci定位 lac_LAC、CI、小区、扇区、基站都是什么
热门文章
- Java 零注解文档生成工具—smart-doc,看完有替换swagger的冲动
- Layui自定义表单校验规则
- python中ab+c*2_day2总结-Python中的基本语法
- 朋友圈文字怎么到中间_怎样查看微信朋友圈访客记录
- mapbox symbols 层级设置_mapboxgl实现带箭头轨迹线的代码
- Yii2如何使用存取控制过滤器(ACF)
- GLib-CRITICAL : g_variant_get_uint32: assertion ‘g_variant_is_of_type (value, G_VARIANT_TYPE_UINT32)
- Agreeing to the Xcode/iOS license requires admin privileges, please run “sudo xcodebuild -license”
- Cause: the class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask was not found
- MacOS新版本,不能装老版本Xcode