幾個簡單的揹包問題

2021-07-28 10:51:21 字數 1954 閱讀 9457

0/1揹包問題,就是給n種石頭每塊石頭的價值為ai,問揹包容量為m的揹包最多裝價值多少?

輸入樣例:

3 82 5 5

3 4 5

輸出:8

因為不能重複選,所以這次**的的最大應該是dp[i-1]

#include#include#include using namespace std;

int dp[500][500];

int cost[500];

int weight[500];

int main()

for(i=1;i<=n;i++)

for(i=1;i<=n;i++)

//cout << endl;

}cout << dp[n][m] << endl;

}

完全揹包問題:就是有n種石頭無限多個,每個的重量為a價值為bii,問揹包為m的揹包最多裝價值多少的石頭

輸入樣例

5 35 

6 82 4

3 94 3

5 6

輸出 103

因為能重複選,所以這次**的的最大應該是max(dp[i-1][j],dp[i][j-weight[i]]+cost[i])!!注意原來是dp[i-1][j]

#include#include#include using namespace std;

int dp[500][500];

int cost[500];

int weight[500];

int main()

for(i=1;i<=n;i++)

// cout << endl;

}cout << dp[n][m] << endl;

多重揹包問題:

有n個石頭,每個有ai個,價值分別為bi,重量為ci,問m的揹包最多裝多少價值?

輸入樣例:

10 20 

2 100 4 

4 100 2

5 100 6

6 100 8

10 100 5

20 100 2

15 50 3

12 60 4

11 80 6

20 90 5

輸出:600

用0/1揹包的問題,乙個石頭多種的就分別當作不同的石頭,o(n*a[i])

#include#include#include using namespace std;

int dp[500][500];

int value[500];

int weight[500];

int ds[500];

int main()

t1=0;

for(i=1;i<=n;i++)

//cout << endl;}}

cout << dp[t1][m] << endl;

}

用二進位制加速

如一塊石頭有18個,因為是1個個加到dp[i][j]的j上,速度很慢,如果將其分為1、2、4、8、4那麼這5個數字的組合是可以得到1-18的任意數的,也就是可以把18個石頭變成5種石頭,揹包的1-m重量加這5個石頭或者18個石頭乙個個加的意義是一樣的。

這樣的複雜度變成o(n*loga[i])

#include#include#include #includeusing namespace std;

int dp[500][500];

int value[500];

int weight[500];

int ds[500];

int ds2[500];

int main()

for(i=1;i<=n;i++)

//cout << endl;}}

cout << dp[t1][m] << endl;

}

簡單揹包問題

設有乙個揹包可以放入的物品重量為s,現有n件物品,重量分別是w1,w2,w3,wn。問能否從這n件物品中選擇若干件放入揹包中,使得放入的重量之和正好為s。如果有滿足條件的選擇,則此揹包有解,否則此揹包問題無解。input 輸入資料有多行,包括放入的物品重量為s,物品的件數n,以及每件物品的重量 輸入...

簡單揹包問題

有乙個容量為v的揹包,從n件物品中選擇一些放入揹包中,每件物品的重量為w i 為v i 怎麼選擇合適的物品使得揹包內物品的總價值最大.這個問題中每個物品可供選擇的次數是0或1.即簡單揹包問題.若可選擇次數為n n為乙個有效的數字 則稱之為有界揹包問題.若可選擇次數無限,則稱之為無界揹包問題.所有的揹...

簡單揹包問題

設有乙個揹包可以放入的物品重量為s,現有n件物品,重量分別是w1,w2,w3,wn。問能否從這n件物品中選擇若干件放入揹包中,使得放入的重量之和正好為s。如果有滿足條件的選擇,則此揹包有解,否則此揹包問題無解。輸入輸入資料有多行,包括放入的物品重量為s,物品的件數n,以及每件物品的重量 輸入資料均為...