揹包問題2

2021-10-03 02:28:23 字數 3001 閱讀 3348

1268:【例9.12】完全揹包問題

時間限制: 1000 ms 記憶體限制: 65536 kb

提交數: 10068 通過數: 5384

【題目描述】

設有nn種物品,每種物品有乙個重量及乙個價值。但每種物品的數量是無限的,同時有乙個揹包,最大載重量為mm,今從nn種物品中選取若干件(同一種物品可以多次選取),使其重量的和小於等於mm,而價值的和為最大。

【輸入】

第一行:兩個整數,mm(揹包容量,m≤200m≤200)和nn(物品數量,n≤30n≤30);

第2…n+12…n+1行:每行二個整數wi,ciwi,ci,表示每個物品的重量和價值。

【輸出】

僅一行,乙個數,表示最大總價值。

【輸入樣例】

10 4

2 13 3

4 57 9【輸出樣例】

max=12

與01揹包問題不同的是可以用無限次

將第二次遍歷正序遍歷的好處是可以將之前的結果累積起來,已達到多次使用的效果 即 當乙個數是之前的乙個數的兩倍時他所累積的結果也是之前的兩倍。

#include

using

namespace std;

int f[35]

[305];

intmain()

for(

int i=

1;i<=n;i++

)for

(int j=

1;j<=m;j++

) cout<<

"max="

<[m]<}

同理換成一維陣列也是一樣的。

多重揹包問題

1269:【例9.13】慶功會

時間限制: 1000 ms 記憶體限制: 65536 kb

提交數: 7906 通過數: 4509

【題目描述】

為了慶賀班級在校運動會上取得全校第一名成績,班主任決定開一場慶功會,為此撥款購買獎品犒勞運動員。期望撥款金額能購買最大價值的獎品,可以補充他們的精力和體力。

【輸入】

第一行二個數n(n≤500),m(m≤6000),其中n代表希望購買的獎品的種數,m表示撥款金額。

接下來n行,每行3個數,v、w、s,分別表示第i種獎品的**、價值(**與價值是不同的概念)和能購買的最大數量(買0件到s件均可),其中v≤100,w≤1000,s≤10。

【輸出】

一行:乙個數,表示此次購買能獲得的最大的價值(注意!不是**)。

【輸入樣例】

5 1000

80 20 4

40 50 9

30 50 7

40 30 6

20 20 1

【輸出樣例】

1040

#include

using

namespace std;

int f[

6005];

intmain()

for(

int i=

1;i<=n;i++

)for

(int j=m;j>=

0;j--)}

cout<<}

優化方案,可以用二進位制數1 2 4等數來組合表示買多件的情況。

#include

using

namespace std;

intmain()

;int w,v,p;

int k=0;

for(

int i=

1;i<=n;i++

) a[

++k]

=s*w;

b[k]

=v*s;

}for

(int i=

1;i<=k;i++)}

cout<

}

這種方法使矩陣上每乙個點的利用率更高從而減少了矩陣大小從而減少了運算次數。

即由0001111111

000002333

000000246

變成了000011111

111122233

22233344

22255667

大概就是這個樣子,原來未利用的點也被利用了,矩陣變得更緊湊。

混合揹包問題

1270:【例9.14】混合揹包

時間限制: 1000 ms 記憶體限制: 65536 kb

提交數: 5353 通過數: 3182

【題目描述】

乙個旅行者有乙個最多能裝v公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,…,wnw1,w2,…,wn,它們的價值分別為c1,c2,…,cnc1,c2,…,cn。有的物品只可以取一次(01揹包),有的物品可以取無限次(完全揹包),有的物品可以取的次數有乙個上限(多重揹包)。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

【輸入】

第一行:二個整數,m(揹包容量,m≤200),n(物品數量,n≤30);

第2…n+1行:每行三個整數wi,ci,piwi,ci,pi,前兩個整數分別表示每個物品的重量,價值,第三個整數若為0,則說明此物品可以購買無數件,若為其他數字,則為此物品可購買的最多件數(pipi)。

【輸出】

僅一行,乙個數,表示最大總價值。

【輸入樣例】

10 3

2 1 0

3 3 1

4 5 4【輸出樣例】

11把前面幾種情況組合一下即可。

#include

using

namespace std;

int f[

205]

;int

main()

for(

int i=

1;i<=n;i++)}

else}}

cout<

}

揹包問題2(完全揹包)

問題的提出 有n種物品,乙個容量為v的揹包,每種物品可以無限的加入揹包,第i種物品的價值為v i 花費為w i 求將那些裝入揹包能讓價值最大且不超過揹包的容量?思路 該題類似於01揹包,唯一的不同就是所有的物品可以無限取,這樣從物品的角度考慮就會有多中方法,不像01中的取或不取 當然01揹包作為最基...

揹包問題2 完全揹包

一,題目 有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是c i 價值是w i 求解將哪些物品裝入 揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。二,基本思路 從每種物品的角度考慮,與它相關的策略已並非取或不取兩種,而是有取0件 取1件 取2件 等很多種。令f ...

揹包問題2

設f i,x 表示前i件物品,揹包容量為x時的最大價值,那麼轉移式可以表示為f i,x max f i 1,x w i c i f i 1,x 那麼f n,m 即為最優解。其實整體思想則表示為從容量為1的開始計算並且後面的計算不斷的使用前面已經計算的值,這樣就可以避免重複計算。code includ...