分組背包問題的Python實現


  分組背包就是把N件商品分成K組,但是每個組里的商品要么一件都不拿要么最多只能拿走一件,問你如何選擇才能取得的價值最大。

  首先這是一個動態規划問題,動態規划問題就要找到遞歸基,這個的遞歸基和01背包問題的差不多。

f[k][v] = max(f[k-1][v], f[k-1][v-cost]+worth)

這個k是第K組v指的是當前背包的容積,這個遞歸基的意思就是我們在第K組要么一件都不要那樣背包容積就不會減少還是原先的V,所以它的最優解肯定就是它前一組也就是K-1組的最優解,表達式就是f[k-1][v]。或者第K組我們取其中一件商品設那件商品體積為cost,價值為worth,這樣表達式就是 f[k-1][v-cost]+worth,我們取這兩種情況的最優解就行了。

while True:
    try:
        N, V = (int(i) for i in input().split())
        f = [0 for i in range(V+1)]
        goods = [[]for i in range(N)]
        for i in range(N):
            piv = int(input())
            for _ in range(piv):
                goods[i].append([int(j) for j in input().split()])
        for k in range(N):
            for v in range(V, 0, -1):
                for i in goods[k]:
          #這個if判斷是很有必要的因為,我們的背包容積是從V一直到0而不是到cost很有可能該商品的體積大於背包當前容積
if i[0] <= v: f[v] = max(f[v], f[v-i[0]]+i[1]) print(f[-1]) except: break

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM