描述
给出一个小数数组A,一个非负整数target。对A中的每个小数进行向上取整或者向下取整的操作,最后得到一个整数数组,要求整数数组的所有数字和等于target,并且要求对小数数组的调整和最小。
例如ceil(1.2),则调整数为0.8;floor(1.2),则调整数为0.2。返回该整数数组。
在线评测地址:领扣题库官网
样例1 输入:A=[1.2,1.3,2.3,4.2],target=9 输出:[1,1,3,4] 解释:1.2- 1,1.3- 1,2.3- 3,4.2- 4。
样例2 输入:A=[2.5,2.5],target=5 输出:[2,3] 解释:2.5- 2,2.5- 3.
解题思路
类比于分组背包问题,每个数字可以看成是包含两个互斥的物品放入即可。对于每个小数,看作是向上取整和向下取整的两个物品,必须选择一个,考虑分组背包。在第二层循环即背包容量的循环中同时考虑两个物品,则可保证选择具有互斥性。
源代码
class Solution: @param A: @param target: @return: nothing def getArray(self, A, target): dp=[100000.0 for i in range(target + 1)] path = [[0 for i in range(len(A) + 1)]for i in range(target + 1)] res = [0 for i in range(len(A))] n = len(A) dp[0] = 0.0 for i in range(n) : for j in range(target,-1,-1) : x , y = math.floor(A[i]) , math.ceil(A[i]) if j x and j y : break if j = x and j = y : #两个物品均可以放入,必选其一 if dp[j - x] + A[i] - x dp [j - y] + y - A[i] : dp[j] = dp[j - x] + A[i] - x path[j][i] = 1 else : dp[j] = dp[j - y] + y - A[i] path[j][i] = 2 elif j = x: #只能放入向下取整整数,直接放入 dp[j] = dp[j - x] + A[i] - x path[j][i] = 1 elif j = y: #只能放入向上取整整数,直接放入 dp[j] = dp[j - y] + y - A[i] path[j][i] = 2 if dp[target] = 10000 : return res else : ssum = target for i in range(n - 1,-1,-1) : #答案的记录此处通过对背包状态回溯完成还原(同样可以参考背包路径问题)。 if path[ssum][i] == 1 : res[i] = math.floor(A[i]) ssum -= math.floor(A[i]) elif path[ssum][i] == 2 : res[i] = math.ceil(A[i]) ssum -= math.ceil(A[i]) return res
更多题解参考:九章官网solution
在这个世界上,人们每天都在用 Python 完成着不同的工作。而文件操作,则是大家...
操作场景 如果您忘记了裸金属服务器的登录密码,或者您想加固密码提升安全性,可...
1. 接口描述 接口请求域名: cvm.tencentcloudapi.com 。 本接口(DescribeImage...
5G的三大应用场景分别是eMBB(增强型移动宽带),uRLLC(低时延、高可靠通信) 和mMT...
操作场景 创建裸金属服务器后,您可以通过多种方式进行登录。本文介绍在管理控制...
我们将创建以下三个Shell脚本来锁定和解锁多个帐户和查看账号状态。 创建锁定用...
哪些 云服务器 是免费的?想申请 免费云服务器 ,大家可以在浏览器中进行搜索,...
客户简介 找靓机(深圳市万事富科技有限公司旗下app)是一个原装二手数码3C的直...
太白金星:听闻老君最近在练神丹妙药,可否与我一讲? 太上老君:老白啊,我最近...
高防服务器对于中小企业来说有着无比巨大的作用,做网站的都知道,一个企业的网...