python銀行家算法1,判斷是否存在安全序列
那個(gè)遞歸函數(shù)絕對(duì)是有問(wèn)題的,只不過(guò)我自己也弄不明白,雖然是手搓的,但說(shuō)實(shí)話我也不知道它為什么能運(yùn)行??,然后里面的變量數(shù)值大部分都是字典,再加上二維列表,所以會(huì)有一大堆下標(biāo)訪問(wèn)元素的代碼,甚至我還用deepcopy庫(kù)來(lái)實(shí)現(xiàn)字典的深度復(fù)制以完成遞歸,說(shuō)實(shí)話這代碼我看了都覺(jué)得low,但好歹能提交通過(guò),儂死我了(家鄉(xiāng)話),我想跑路進(jìn)廠了??,我寧愿拿個(gè)扳手敲敲打打也不愿意在這看一堆亂碼,每天的問(wèn)題就是這代碼為什么不能運(yùn)行?以及這代碼為什么能運(yùn)行?我的頭發(fā)已經(jīng)開(kāi)始跑了,身體還沒(méi)準(zhǔn)備好??,???? 代碼在下邊,注釋是給漂亮女同學(xué)寫的(雖然現(xiàn)在讓我搞的關(guān)系有點(diǎn)緊張,不會(huì)說(shuō)話的神經(jīng)質(zhì)??,幫助同學(xué)幫助同學(xué)),我按照邏輯順著寫的,但其中應(yīng)該會(huì)有我想不到的分支情況,具體需要深入研究,但我現(xiàn)在可能沒(méi)太多時(shí)間,還要學(xué)其他的英語(yǔ)數(shù)學(xué)什么的,有人弄明白了可以隨時(shí)私信我?? 你有一個(gè)思想,我有一個(gè)思想,我們互相交換,我們每個(gè)人都擁有了兩個(gè)思想?? from copy import deepcopy N=int(input()) M=int(input()) # 存放資源最大值[10, 5, 7] source_all=list(map(int,input().split())) # 存放程序的資源分配和最大使用數(shù)據(jù) dict_information={}? for i in range(N): ??items=input().split() ??list_max=list(map(int,items[1:M+1])) #把輸入的一行數(shù)據(jù)的第2個(gè)到第M個(gè)拿出來(lái) ??list_allocation=list(map(int,items[M+1:])) # 把輸入的第M個(gè)到第最后一個(gè)拿出來(lái) ??list_need=[list_max[i]-list_allocation[i] for i in range(M)] #用最大減去已分配得到need ??dict_information[items[0]]=[list_max,list_allocation,list_need] # 把上面這三列表合成一個(gè)大列表放字典里 # dict_information存的數(shù)據(jù) # ('P0', [[7, 5, 3], [0, 1, 0], [7, 4, 3]]) # ('P1', [[3, 2, 2], [2, 0, 0], [1, 2, 2]]) # ('P2', [[9, 0, 2], [3, 0, 2], [6, 0, 0]]) # ('P3', [[2, 2, 2], [2, 1, 1], [0, 1, 1]]) # ('P4', [[4, 3, 2], [0, 0, 2], [4, 3, 0]]) # 計(jì)算資源可用的數(shù)量 list_available=source_all for item in dict_information.items(): ??for i in range(M): ????list_available[i]-=item[1][1][i]? # list_available=[3, 3, 2] #把need和數(shù)據(jù)拿出來(lái)放字典里等會(huì)計(jì)算用 dict_need={} dict_allocation={} for item in dict_information.items(): ??dict_need[item[0]]=item[1][2] ??dict_allocation[item[0]]=item[1][1] # 通過(guò)用list_available和不同程序的need匹配來(lái)判斷是否可執(zhí)行下一步 # 初步判斷用遞歸 def find(dict_allocation,dict_need,list_available,M): ??if not dict_allocation.items():# 遞歸終止條件,因?yàn)橄旅娴倪f歸函數(shù)處每次將字典項(xiàng)目減一,所以當(dāng)dict_allocation中的項(xiàng)目為0時(shí)表明所有進(jìn)程都被選擇過(guò)了,也就是都能運(yùn)行 ????return 1 ??for i in dict_need.items(): ????list1=[1 if i[1][j]<=list_available[j] else 0 for j in range(M)] #因?yàn)橛蠱個(gè)資源,需要每個(gè)資源都足夠程序才能運(yùn)行,所以用遍歷判斷滿足條件的資源,滿足就置1,不滿足置0 ????if sum(list1)==M:#?在這里判斷是不是所有資源都滿足條件,也就是判斷上邊列表元素是不是都是1 ??????# print(i[0],end=' ') ??????dict_allocation_back=deepcopy(dict_allocation)# 以下四句都是為函數(shù)遞歸調(diào)用做準(zhǔn)備,因?yàn)椴幌胱屧值鋽?shù)據(jù)改變(因?yàn)橐粫?huì)還要輸出用),又想進(jìn)行函數(shù)遞歸調(diào)用(每次調(diào)用都將字典中的某一個(gè)滿足運(yùn)行條件的程序刪除后再給函數(shù)用) ??????del dict_allocation_back[i[0]] #刪除滿足條件的該程序(這里是i) ??????dict_need_back=deepcopy(dict_need) ??????del dict_need_back[i[0]]#這兩句和上兩句一樣,都是把滿足條件的這個(gè)程序刪掉 ??????status=find(dict_allocation_back,dict_need_back,[list_available[j]+dict_allocation.get(i[0])[j] for j in range(M)],M) ??????# 函數(shù)遞歸調(diào)用 ??????if status: ????????# print(i[0]) ????????# 只有當(dāng)find返回1時(shí)該if語(yǔ)句才運(yùn)行,而由于遞歸的存在,所有遞歸函數(shù)都停止在上面的status=find(dict_allocation_back,dict_need_back,[list_available[j]+dict_allocation.get(i[0])[j] for j in range(M)],M) ????????#處等待子函數(shù)的返回,而我在函數(shù)開(kāi)頭定義了遞歸終止條件,所以當(dāng)找遞歸到字典里沒(méi)有程序的時(shí)候會(huì)返回1,然后父進(jìn)程的status接收到return 1后,我用status接收,然后再次return 1, ????????#然后層層返回1,最后結(jié)束return 1 ????????return 1 ??????else: ????????return 0 ??if i==len(dict_need.items()): ????#當(dāng)不存在一個(gè)安全序列時(shí),也就是for循環(huán)中的滿足條件的程序不存在,那么if不運(yùn)行,字典也就不再減少內(nèi)容,for循環(huán)里的return語(yǔ)句也就不會(huì)執(zhí)行,那么for循環(huán)會(huì)運(yùn)行到正常結(jié)束 ????#此時(shí)我通過(guò)判斷i(這里的i就是for循環(huán)用的i)與字典長(zhǎng)度相等得到?jīng)]有滿足條件的程序存在,所以我返回0,然后在父程序的for循環(huán)中的status收到return 0,那么父程序也會(huì)return 0, ????# 再次層層return 0,最后return 0 ????? ????return 0 print("name max allocation need available") #這個(gè)a只是輸出的時(shí)候第一行多個(gè)available,我讓第一句和剩下的幾句不一樣輸出,就加了個(gè)a a=1 for item in dict_information.items(): ??if a==1: ????a-=1 ????print(item[0],end=' ') ????print(*item[1][0],end=' | ') ????print(*item[1][1],end=' | ') ????print(*item[1][2],end=' | ') ????print(*list_available) ??else: ????print(item[0],end=' ') ????print(*item[1][0],end=' | ') ????print(*item[1][1],end=' | ') ????print(*item[1][2],end=' |') ????print() # 這里執(zhí)行find函數(shù)判斷是否有安全序列存在 if find(dict_allocation,dict_need,list_available,M): ??print("找到安全序列,處于安全狀態(tài)。") else: ??print("找不到安全序列,處于不安全狀態(tài)。")