分組背包就是把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