多重背包问题 I(动态规划)
多重背包问题 I
有 N 种物品和一个容量是 V 的背包。
第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。
接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤100
0<vi,wi,si≤100
输入样例
4 5
1 2 3
2 4 1
3 4 3
4 5 2
输出样例:
10
01背包问题演进:
1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 5 using namespace std; 6 constexpr int N = 110; 7 int main() { 8 int n = 0; 9 int v = 0; 10 std::cin >> n >> v; // 输入物品数量和背包容量 11 vector<int> dp(N, 0); 12 for (int i = 1; i <= n; i++) { 13 int volume = 0; 14 int weight = 0; 15 int count = 0; 16 std::cin >> volume >> weight >> count; // 输入每件物品的体积、价值、最大可选择数量 17 for (int j = v; j >= volume; j--) { // 类似01背包 18 for (int k = 1; k <= count && k * volume <= j; k++) { // 遍历同一件物品选择次数 19 dp[j] = max(dp[j], dp[j - k * volume] + k * weight); 20 } 21 } 22 } 23 std::cout << dp[v] << endl; 24 return 0; 25 }
浙公网安备 33010602011771号