MAX=1000
def takeSecond(elem):
return elem[1]
def Arrange(n,work):
#按照每个任务的截止时间升序排列
work.sort(key=takeSecond)
print("排序后:")
for i in range(1,n+1):
print(work[i])
deadline=work[n][1]#最大截止时间
#punished[i][j]为当截止时间为j时前i个任务的最小惩罚
punish=[[MAX]*(deadline+1) for i in range(n+1)]
#初始化只有一个任务时
for j in range(deadline+1):#j表示整体的截止时间
#若第一个任务的执行时间大于整体的截止时间则执行,最小惩罚置为0
if work[1][0]<= j:
punish[1][j] = 0
#若第一个任务的执行时间小于整体的截止时间则执行,最小惩罚置为第一个任务的误时惩罚
else:
punish[1][j] = work[1][2]
if punish[1][deadline]==0:
count=1#count表示执行的文件个数,若第一个文件执行了则为1
for i in range(2,n+1):
for j in range(deadline+1):
#第i个任务不执行
punish[i][j] = punish[i-1][j] + work[i][2]
#time为第i个任务截止的最后时间
time=min(j,work[i][1])
#若第i个任务可执行,且执行比不执行的最小惩罚小
if(time >= work[i][0] and punish[i][j]>punish[i-1][time-work[i][0]]):
punish[i][j] = punish[i-1][time-work[i][0]]
#当截止时间为最大截止时间时,若第i个文件执行了则count加1
if j==deadline:
count+=1
print("任务安排表:")
for i in range(1,n+1):
print(punish[i])
return punish[n][deadline],count
#从文件中读出数据
file_readpath = 'input.txt'
with open(file_readpath) as file:
txt = file.read()
txt=txt.split('\n')
n=eval(txt[0])
work=[[0,0,0]]
for t in txt[1:]:
t=t.split()
work.append([eval(t[0]),eval(t[1]),eval(t[2])])
punish,count=Arrange(n,work)
print("最小惩罚为",punish)
print("执行文件个数为",count)
#将结果存入文件output.txt
file_writepath = 'output.txt'
file=open(file_writepath,"w")
file.write(str(punish)+'\n'+str(count))
file.close()
运行结果: