分析:這個和我們之前講的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 62 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 #include2int 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...