[leetcode/lintcode 题解] 算法面试真题详解:浮点数组合和

简介: [leetcode/lintcode 题解] 算法面试真题详解:浮点数组合和

描述
给出一个小数数组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

相关文章
|
6天前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
12天前
|
算法 Go
[go 面试] 雪花算法与分布式ID生成
[go 面试] 雪花算法与分布式ID生成
|
5天前
|
算法
聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子
聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子
|
11天前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
28 6
|
11天前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
26 1
|
11天前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
22 1
|
12天前
|
算法
突击面试:解密面试官的算法题集合
突击面试:解密面试官的算法题集合
|
4天前
|
开发者 索引 Python
这些年背过的面试题——LeetCode
本文是技术人面试系列LeetCode篇,一文带你详细了解,欢迎收藏!
|
11天前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
31 0
|
11天前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
22 0