動態規劃 入門3 多重揹包問題

2022-05-12 07:43:56 字數 1715 閱讀 3156

分析:這個和我們之前講的0-1揹包問題很像。

思路1:

我們顯然可以把每種物品的每一件都作為乙個新的物品按照普通0-1揹包的方法做。

但是0-1揹包的時間複雜度是o(w * n) , 這裡n = c1 + c2 + …+ cn。

思路2:

換個角度我們用dp[i][j]表示前i件物品,總重量為j的時候的最大價值。

則dp[i][j] = max

其中 0 ≤ k ≤ min( j / wi , ci)

這個的時間複雜度是n * w * max(ci)

最後,我們來提供輸入輸出資料,由你來寫一段程式,實現這個演算法,只有寫出了正確的程式,才能繼續後面的課程。

輸入

第1行,2個整數,n和w中間用空格隔開。n為物品的種類,w為揹包的容量。(1 <= n <= 100,1 <= w <= 50000)

第2 - n + 1行,每行3個整數,wi,pi和ci分別是物品體積、價值和數量。(1 <= wi, pi <= 10000, 1 <= ci <= 200)

輸出

輸出可以容納的最大價值。

輸入示例

3 6

2 2 5

3 3 8

1 4 1

輸出示例

9

請選取你熟悉的語言,並在下面的**框中完成你的程式,注意資料範圍,最終結果會造成int32溢位,這樣會輸出錯誤的答案。

1 line=input().split()

2 n=int(line[0])

3 m=int(line[1])

4 w=

5 p=

6 c=

7for i in

range(n):

8 line=input().split()

9 tw=int(line[0])

10 tp=int(line[1])

11 tc=int(line[2])

12 k=1

13while tc>=k:

16 tc-=k

17 k*=2

18if tc>0:

21 n2=len(w)

22 f=

23for i in range(m+1):

2425

for i in

range(n2):

26for j in range(m,w[i]-1,-1):

27 f[j]=max(f[j],f[j-w[i]]+p[i])

28print

(f[m])

29

又超時!!

1 #include2

int max(int a,intb)6

intmain()

21if (c>0)26

}27int n2=j+1;28

for(int i=0;i<=m;i++)

31for(int i=0;i)35}

36 printf("

%ld"

,f[m]);

37return0;

38 }

動態規劃入門 揹包問題(01 完全 多重)

一 揹包問題 1 01 揹包 給定 n 種物品和乙個容量為 c 的揹包,物品 i 的重量是 wi,其價值為 vi 問 應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?分析 對於每個物品,我們都有兩種選擇,取和不取。我們可以定義乙個二維陣列dp i j 表示有i件物品,揹包容量為j時獲得...

動態規劃入門 揹包問題

有n個重量和價值分別為wi,vi的物品。從這些物品中選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值。在這裡,每個物品只能選一件。1 n 100 1 wi,vi 100 1 w 10000 n 4 w,v w 5 7 選擇0 1 3號物品 暴力法 複雜度o 2n include inclu...

動態規劃入門之揹包問題

int value maxlen 前i種物品中取若干種,在總體積不超過j的條件下取得的最大值 int weight 3500 int dvalue 3500 int main i 1時 for int j 1 j m j for int i 2 i n i for int j m j 0 j cou...