zoukankan      html  css  js  c++  java
  • 常见算法及python代码续

    4.机器调度问题

    m台机器,n个任务,每个任务时间可能不一致,求如何分配,在最短的时间完成任务?

    def machine(time_list,m):
        time_list.sort(reverse=True)
        if len(time_list)<=m:
            return time_list[0]
        else:
            temp = time_list[0:m]
            for i in time_list[m:]:
                min_index = temp.index(min(temp))
                temp[min_index]+=i
            return max(temp)
    
    re = machine([33,44,55,23],3)
    print(re)

    简单解析:先排序,n个任务按时间从大到小降序,m个机器按时间长短各排好一个任务,未排上的第一个任务时间是剩下任务时间中最长的,将归属于最后一个机器,因为归属于其他机器累计时间会更长,未排上的第二个任务同理给m个机器中时间最少的那个,此时时间最少的不一定是最后的那个机器,依此类推。

    5.背包问题

    weight = [5, 3, 4, 2]
    value = [6, 4, 5, 3]
    max_weight = 8
    
    
    def bag(weight, value, max_weight):
        weight.insert(0, 0)
        value.insert(0, 0)
        thing_num = len(weight)
        # 建立一个thing_num * (max_weight+1)的二维矩阵  5*9
        dp = []
        for i in range(thing_num):
            dp.append([0]*(max_weight+1))
        for i in range(1,thing_num):
            for j in range(1,max_weight+1):
                dp[i][j] = dp[i-1][j]
                if j>=weight[i]:
                    dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])
        return dp[-1][-1]
    re = bag(weight, value, max_weight)
    print(re)

     目标:以有限的背包容量装最大化价值物品,本例背包最大容量为8,物品有四个,对应容量和价值如上所示。

    简单解析:二维矩阵动态规划分析,纵轴方向是前 i 个物品选择放入背包(以下称为状态),横轴方向是背包容量从0到8(以下称为容量),个人理解:二维表是从左至右,从上至下逐一填写记录,填写的值是包中物品的总价值,value值按右下方向是逐渐增大的,基本理论:1.如果此时物品放不下,则包中价值为上一状态同等容量的价值;2.如果此时物品能装入包中,但不能判定装此物品价值一定高于上个状态(未装此物品)的价值,所以包价值=max(上一状态同等容量的价值,上一状态减去该物品容量的价值+该物品的价值),此处不易理解,放图说明:

     红框值指的是状态为3容量为5的价值,也就是容量为2,3,4的三种物品随机组合放入容量为5的背包中的最大价值。它怎么推出来的呢?

    首先,判断状态3新加的物品容量(4)是否大于背包容量(5),所以新物品是可以装到包中的;

    满足上述基本理论2,所以接下来算max括号里的东西就好了:

    上一状态同等容量的价值  =  绿框的值  =  7,

    上一状态减去该物品容量的价值+该物品的价值  =  蓝框的值的总和  =  0+5

    (脑子直观感受就是,容量为5,装上4,价值为5,但容量只剩下1,再也装不了了,总价值为5;仍然只装2和3的话,正好装上,价值为3+4)

    出现了装上新物体反而价值低的情况,所以选择上一状态的价值,保持一直递增的记录,最终得出容量为8,状态为4的最终价值。

  • 相关阅读:
    你不知道的 JavaScript 系列中( 21 ) -尽量不要使用 Object()/Function()/RegExp()
    你不知道的 JavaScript 系列中( 20 ) - 永远不要创建和使用空单元数组
    你不知道的 JavaScript 系列中( 19 ) - 封装对象拆封
    你不知道的 JavaScript 系列中( 18 ) - 封装对象包装
    你不知道的 JavaScript 系列中( 17 ) - 内部属性[[Class]]
    你不知道的 JavaScript 系列中( 16 ) - 原生函数
    node 切换 安装
    Mac  nginx  安装
    cnpm 安装
    2020年面试及入职新公司的痕迹
  • 原文地址:https://www.cnblogs.com/sima-3/p/14832090.html
Copyright © 2011-2022 走看看