考慮到在虛擬機部署中資源提供商通常希望自己的收益最大化,現假設有一臺宿主機,共有x個cpu和y GB的內存,用戶可以採取自己報價的方式向資源提供商申請使用虛擬機資源,譬如說付w元申請a個cpu和b GB內存的一臺虛擬機。請你設計一個算法,讓資源提供商可以合理地安排虛擬機,使得自己的收益最大化。
輸入:
n x y
2 4 200
4 2 150
…
考慮到在虛擬機部署中資源提供商通常希望自己的收益最大化,現假設有一臺宿主機,共有x個cpu和y GB的內存,用戶可以採取自己報價的方式向資源提供商申請使用虛擬機資源,譬如說付w元申請a個cpu和b GB內存的一臺虛擬機。請你設計一個算法,讓資源提供商可以合理地安排虛擬機,使得自己的收益最大化。
輸入:
n x y
2 4 200
4 2 150
…
貪心法就是選擇一種目前最好的策略來實現,而不從整體來看,本題就可以選擇單位cpu價錢最高來實現
import sys
a = list(map(int, input().split())) # 用數組a來存儲參與報價的用戶的個數雲端要存儲的cpu個數,容量大小
a1 = a[0] # 存儲用戶個數,要輸入幾行數據
a2 = a[1] # 存儲cpu的個數
a3 = a[2] # 存儲容量
b = [] # 用二維數組b來存儲用戶的報價信息
b1 = [0]*a1 #數組b1存儲單位內存價格
b2 = [0]*a1 #數組b2存儲單位容量價格
p1 = [0]*a1
p2 = [0]*a1 #分別記錄位置信息
num_sum = 0 #記錄第一種貪心的數據
sto_sum = 0 #cpu累加個數和內存容量累加初始化爲0
prize_sum = 0 #總價值
num_sum1 = 0 # 記錄第二種貪心策略的數據
sto_sum1 = 0
prize_sum1 = 0
for i in range(a1): #內存數,容量數,價格
b.append(list(map(int, input().split())))
for k in range(a1):
b1[k] = b[k][2]/b[k][0]
b2[k] = b[k][2]/b[k][1]
p1[k] = k
p2[k] = k
for i in range(0, a1-1): # 對單位CPU進行排序,並且記錄位置
for j in range(1, a1-i):
if b1[j]> b1[j-1]:
tmp = b1[j-1]
b1[j-1] = b1[j]
b1[j] = tmp
tmp = p1[j-1]
p1[j-1] = p1[j]
p1[j] =tmp
for i in range(0, a1-1): # 對單位容量進行排序,記錄位置
for j in range(1, a1-i):
if b2[j]> b2[j-1]:
tmp = b2[j-1]
b2[j-1] = b2[j]
b2[j] = tmp
tmp = p2[j-1]
p2[j-1] = p2[j]
p2[j] =tmp
# 不能超過cpu總個數,不能超過總容量,從大到小開始累加
while num_sum <= a2 and sto_sum <= a3:
for i in range(a1):
num_sum = num_sum+b[p1[i]][0]
sto_sum = sto_sum+b[p1[i]][1]
prize_sum = prize_sum+b[p1[i]][2]
while num_sum1 <= a2 and sto_sum1 <= a3:
for i in range(a1):
num_sum1 = num_sum1 + b[p2[i]][0]
sto_sum1 = sto_sum1 + b[p2[i]][1]
prize_sum1 = prize_sum1 + b[p2[i]][2]
if prize_sum > prize_sum1:
print(prize_sum)
else:
print(prize_sum1)