01揹包相關問題python

 經典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))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章