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,以及每件物品的重量 輸入資料均為...