各位大佬,有知道今天晚上阿里模拟笔试的编程题怎么做的吗?

某商家开展用福卡兑换现金券的促销活动。该商家规定,和谐福、爱国福、敬业福、友善福及富强福的积分分别是F1、F2、F3、F4和F5,顾客收集齐N积分的福卡,即可获得现金券一张。假设,福卡只能通过扫描“福”字获得,每次扫描“福”字最多获得一张福卡,需指定该次扫描获得的福卡类型,获得和谐福、爱国福、敬业福、友善福和富强福的概率分别为P1、P2、P3、P4及P5。请问,为获得一张现金券,最少需要扫描“福”字次数的期望值是多少?



编译器版本: Python 2.7.6

请使用标准输出(sys.stdout);已禁用图形、文件、网络、系统相关的操作,如Process , httplib , os;缩进可以使用tab、4个空格或2个空格,但是只能任选其中一种,不能多种混用;如果使用sys.stdin.readline,因为默认会带换行符,所以要strip(' ')进行截取;建议使用raw_input()



输入:

第一行有5个整数F1、F2、F3、F4和F5,分别表示和谐福、爱国福、敬业福、友善福及富强福的积分; 第二行有1个整数N,表示顾客应收集的积分; 第三行有5个浮点数P1、P2、P3、P4和P5,分别表示一次扫描“福”子获得和谐福、爱国福、敬业福、友善福及富强福的概率。

输出:

仅包含一个double类型(小数点后保留两位小数),表示最少需要扫描“福”字次数的期望值。如果无解,则输出0.00。

输入范例:

100 100 100 100 100 100 0.5 0.2 0.2 0.2 0.2

输出范例:

2.00

全部评论
完全背包,积分变成容量,最大价值变成最小期望值,每个福的期望值为概率的倒数。
点赞 回复 分享
发布于 2018-05-08 14:50
每张福卡的积分*概率 = 每扫一次这种福卡能拿到的积分的期望。 然后应该贪心就可以了 我做的不是这题,不知道这样的想法对不对 样例: 100 * 0.5 = 50, 100 * 1.0 / 50 = 2.0
点赞 回复 分享
发布于 2018-05-07 20:08
这道题和换零钱问题(https://www.nowcoder.com/questionTerminal/185dc37412de446bbfff6bd21e4356ec)相似 不同的地方在于加入了几何分布,且dp[i][j]的意义变成了达到金钱j所需要的最小扫描次数。 今天才写的代码,有问题还望大家指出 #coding=utf-8 from __future__ import division class MininumScan:     def count_scans(self, changes, scans, n, x):         """利用动态规划来求最小扫描次数,动态递归分两层,一层是是否使用零钱列表中的下一个零钱种类;            一层是使用一次某种零钱后,期望金额的变化"""         if n == 0:             return -1         dp = [[-1 for i in range(x + 1)] for j in range(n)] # 初始化二维列表, -1表示凑不出这个金额         for i in range(n):             dp[i][0] = 0 # 凑出0需要0次扫描         for j in range(1, x + 1):             if j % changes[0] == 0:                 dp[0][j] = (j / changes[0]) * scans[0] # 金额是changes[0]的整数倍才可能凑出来         for i in range(1, n):             for j in range(1, x + 1):                 # 计算使用changes[i]的扫描情况                 if j - changes[i] >= 0 and dp[i][j - changes[i]] != -1:                     tmp = dp[i][j - changes[i]] + scans[i]                 else:                     tmp = -1                 # 递推,核心部分                 if tmp == -1:                     dp[i][j] = dp[i - 1][j]                 else:                     if dp[i - 1][j] == -1:                         dp[i][j] = tmp                     else:                         dp[i][j] = min(tmp, dp[i - 1][j])         return dp[n - 1][x] test = MininumScan() line = raw_input() scores = [int(x) for x in line.split(' ')] expect_num = int(raw_input()) line = raw_input() pros = [float(x) for x in line.split(' ')] scans = [1 / x for x in pros] # 扫出某张福卡的期望次数 n = len(changes) print(test.count_scans(scores, scans, n, expect_num))
点赞 回复 分享
发布于 2018-05-08 14:15
不是很懂题目,是不是先要求多元一次方程 af1+bf2+cf3+df4+ef5=N 是否有整数解 然后用贪心求次数
点赞 回复 分享
发布于 2018-05-08 09:34
必须用Python 吗
点赞 回复 分享
发布于 2018-05-07 22:23
直接dp就行了…
点赞 回复 分享
发布于 2018-05-07 21:22
个人想法是 获得一张福卡的积分的期望次数是1/p,然后排列组合到目标积分找到最小次数。不过这个想法并没有运行
点赞 回复 分享
发布于 2018-05-07 21:09
我没看懂这道题。。。
点赞 回复 分享
发布于 2018-05-07 20:02
兄弟,你选的什么岗位啊,我的编程题就是一道类似于字符串去重的问题
点赞 回复 分享
发布于 2018-05-07 20:01

相关推荐

10-17 23:18
已编辑
西北农林科技大学 Web前端
独行m:给25可以试试,但他只能给12,那就是纯纯的事精
秋招,不懂就问
点赞 评论 收藏
分享
评论
1
9
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务