經典01揹包問題:
n個物品價值爲 p[n],體積爲 w[n],現有一個容量爲 v 的揹包,怎麼裝物品價值最大?
n = 6
c = 10
w = [2, 2, 3, 1, 5, 2]
v = [2, 3, 1, 5, 4, 3]
def bag(n,c,w,v):
value =[0 for i in range(c+1)]
for i in range(1,n):
for j in range(c,0,-1):
if j>=w[i]:
value[j]= max(value[j],v[i]+value[j-w[i]])
return value[-1]
print( bag(n, c, w, v))
vivo筆試題中的升級版01揹包。
總內存和總磁盤空間,每個應用佔用磁盤和內存,開最多的用的應用。
相當於有兩個揹包,求解怎麼裝,裝的最多。
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Welcome to vivo !
'''
def solution(total_disk, total_memory, app_list):
# TODO Write your code here
print(total_disk, total_memory, app_list)
w1=[]
w2=[]
v=[]
for i in app_list:
w1.append(i[0])
w2.append(i[1])
v.append(i[2])
values = [[0 for i in range(total_memory+1) ] for j in range(total_disk+1) ]
for k in range(1,len(w1)+1):
for i in range(total_disk,0,-1):
for j in range(total_memory,0,-1):
if i >= w1[k-1] and j >= w2[k-1]:
values[i][j] = max(values[i-w1[k-1]][j-w2[k-1]]+v[k-1], values[i][j])
return values[total_disk][ total_memory]
if __name__ == "__main__":
input1 = input()
disk = int(input1.split()[0])
memory = int(input1.split()[1])
input2 = input1.split()[2]
app_list = [[int(j) for j in i.split(',')] for i in input2.split('#')]
print(solution(disk, memory, app_list))