当前位置: 首页 > news >正文

【剑指offer】面试题43:n个骰子的点数

第一种思路是,每一个骰子的点数从最小到最大,如果为1-6,那么全部的骰子从最小1開始,我们如果一种从左向右的排列,右边的最低,索引从最低開始,推断和的情况。

def setTo1(dices, start, end):
	for i in range(start, end):
		dices[i] = 1

def probability(n, s, dmax = 6, dmin = 1):
	if s < n * dmin or s > n * dmax : return 0
	dices = [1] * n
	i = n - 1
	total = 0

	while i >= 0:
		curSum = sum(dices)
		if curSum == s:			
			print dices
			total += 1
			# find first one that can +1	
			for j in range(i, -1, -1):
				if dices[j] < dmax and s - sum(dices[0:j+1]) >= n - j*dmin:
					dices[j] += 1
					setTo1(dices, j + 1, n)
					i = n - 1
					break
				else:
					i -= 1
		elif curSum < s:
			if dices[i] < dmax:
				dices[i] += 1
				i = n - 1
			else:
				i -= 1

	print "total = {0}, prob = {1}%".format(total, total*100/dmax**n)	
	return total

若当前和小于s,则检验当前索引处的骰子是否能添加�1,若能,则添加�,否则查看其前面的是否能添加�。若相等,那么我们统计信息后,要变化当前的情形,以便处理下一种情况,由于 索引是从低位開始到当前位的,所以我们从当前索引開始,向前找能继续添加�的骰子,这里的推断标准是当前骰子的点数小于最小值,并且要保证其后的骰子的最小值为1,比方 1,4,1, s = 6, 当前索引指向4, 这里的4尽管小于最大点数6, 但若其再加一,第三个骰子就的为0,这不符合要求。若找到能够加一的骰子,那就将该骰子点数加1, 将其后的骰子都置为1,索引回到最后,開始又一次加起。如:1,1,6,s = 8, 索引指向6, 改动后为1,2,1,索引指向最后的1,。若没有找到能够再添加�的骰子,那么就结束。如6,1,1,s = 8。

事实上若给定的n不大的话,我们能够设一个n位整数,从n个1開始,逐次加一,来推断各个位的和是否满足要求,直到达到最大值,n个6。

这个问题事实上动态规划的特点非常明显。

'''
	@ state function: dp[i, j]: the total cases of sum = j, composed by i dices
	@ state tranfor function: dp[i, j] = sum(dp[i - 1, j - k]) for k in [dmin, dmax] 
	@ dp[i, j] = 0, j > i * dmax or j < i * dmin
	@ init condition: dp[1, k] = 1, for k in [dmin, dmax], dp[1, k] = 0, for other k
'''		
def dp_probability(n, s, dmax = 6, dmin = 1):
	if s < n * dmin or s > n * dmax : 
		return 0
	dp1 = [0] * (n * dmax + 1)
	
	#init dp[1, :]
	for i in range(1, dmax + 1):
		dp1[i] = 1
	# i: the number of dices
	for i in range(2, n + 1):
		dp2 = [0] * (n * dmax + 1)
		# j: range of i dices
		for j in range(dmin * i, dmax * i + 1):
			# k: range of new added dice 
			for k in range(dmin, dmax + 1):
				if j > k :
					dp2[j] += dp1[j - k]
		print dp2
		dp1 = dp2
	print "total = {0}, prob = {1}%".format(dp2[s], dp2[s]*100/dmax**n)
	return dp2[s]


相关文章:

  • WordPress插件WP-PostViews的调用方法
  • 制作Windows Server 2003/08 image详细步骤与OpenStack介绍
  • 免费获得NOD32 半年、1年 激活码-14.08.12到期
  • 第二篇:SOUI源码的获取及编译
  • Angular中在前后端分离模式下实现权限控制 - 基于RBAC
  • window策略设置
  • iOS开发拓展篇—音频处理(音乐播放器5)
  • Storm--一个包含存储和计算的大数据实时计算新系统
  • 033_3
  • 得到手机后台中的应用程序
  • SQLCLUSTER sql数据库监测工具
  • 通过Rman方式创建Oracle11g DataGuard物理备库
  • nmon 监控软件
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • Frame - 快速创建高品质的 Web 应用原型
  • 0x05 Python数据分析,Anaconda八斩刀
  • input的行数自动增减
  • Koa2 之文件上传下载
  • mongodb--安装和初步使用教程
  • Python语法速览与机器学习开发环境搭建
  • ReactNative开发常用的三方模块
  • SQLServer之创建显式事务
  • uni-app项目数字滚动
  • 从输入URL到页面加载发生了什么
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 给初学者:JavaScript 中数组操作注意点
  • 官方解决所有 npm 全局安装权限问题
  • 使用docker-compose进行多节点部署
  • 新书推荐|Windows黑客编程技术详解
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 学习笔记TF060:图像语音结合,看图说话
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 再谈express与koa的对比
  • AI算硅基生命吗,为什么?
  • Python 之网络式编程
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • ${ }的特别功能
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (ibm)Java 语言的 XPath API
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (待修改)PyG安装步骤
  • (二)PySpark3:SparkSQL编程
  • (九十四)函数和二维数组
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (四)模仿学习-完成后台管理页面查询
  • (一)UDP基本编程步骤
  • (转)【Hibernate总结系列】使用举例
  • .form文件_一篇文章学会文件上传
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .Net中wcf服务生成及调用
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复