动态规划——独立任务最优调度问题

独立任务最优调度问题

动态规划——独立任务最优调度问题_第1张图片

采取动态规划的算法

d p [ k ] [ i ] [ j ] 代 表 前 k 个 作 业 可 以 在 A 用 时 不 超 过 i , B 用 时 不 超 过 j 的 时 间 内 完 成 dp[k][i][j]代表前k个作业可以在A用时不超过i,B用时不超过j的时间内完成 dp[k][i][j]kAiBj

则有 d p [ k ] [ i ] [ j ] = d p [ k − 1 ] [ i − a k ] [ j ] ∣ d p [ k − 1 ] [ i ] [ j − b k ] dp[k][i][j]=dp[k-1][i-a_k][j]|dp[k-1][i][j-b_k] dp[k][i][j]=dp[k1][iak][j]dp[k1][i][jbk]

求出其中最大的耗时即 m a x C o s t = m a x ( m a x ( a i ) , m a x ( b i ) ) maxCost=max({max({a_i}),max({b_i}))} maxCost=max(max(ai),max(bi))

需要开辟的数组空间为$ (maxCostk)(maxCost*k)*k$

只需要找到使得 d p [ k ] [ i ] [ j ] = = 1 dp[k][i][j]==1 dp[k][i][j]==1成立的 m a x ( i , j ) max(i,j) max(i,j)的最小值即可

而对于每个作业,只需要对其在A和B上分别赋值即可.而显然 i i i需要大于等于 a k a_k ak, j j j需要大于等于 b k b_k bk

代码如下:

# -*- coding: utf-8 -*-
"""
Created on Mon Apr 11 11:00:46 2022

@author: skyoung
"""

## 先读入数据
import re
fin=open('input.txt','r')
n=int(fin.readline().strip('\n').strip(' '))
dataA=(fin.readline().strip())
dataA=re.findall("\d+",dataA)
dataB=(fin.readline().strip())
dataB=re.findall("\d+",dataB)
dataA=[int(x) for x in dataA]
dataB=[int(x) for x in dataB]
fin.close() 
# 处理完毕,开始进行分类处理


#先寻找一下最大耗时
maxCost=max(max(dataA),max(dataB))*n

dp=[[[0]*(maxCost+1) for _ in range(maxCost+1)] for _ in range(n+1)]

for i in range(maxCost):
    for j in range(maxCost):
                   dp[0][i][j]=1 #从第一件开始
                   

for k in range(1,n+1):
    for j in range(maxCost):
        i=maxCost
        while i>=dataA[k-1]:
            dp[k][i][j]=dp[k-1][i-dataA[k-1]][j]
            i-=1
    for i in range(0,maxCost):
        j=maxCost
        while j>=dataB[k-1]:
            dp[k][i][j]=dp[k-1][i][j-dataB[k-1]]
            j-=1
            
res=123456789#开大一点
for i in range(maxCost):
    for j in range(maxCost):
        if dp[n][i][j]==1:
            temp=max(i,j)
            if temp<res:
                res=temp
print("the answer is ",res)

空间复杂度为 O ( n ∗ n ∗ m a x C o s t ) O(n*n*maxCost) O(nnmaxCost)

时间复杂度为 O ( n ∗ n ∗ m a x C o s t ∗ m a x C o s t ∗ n ) O(n*n*maxCost*maxCost*n) O(nnmaxCostmaxCostn)

你可能感兴趣的:(算法笔记——动态规划,动态规划,算法,数据结构)