超市中有 n 种商品,每种商品的价值为 vi,重量为 wi,每种商品的数量为 mi。小明的目标是选择一些商品,使购物车的总重量不超过 W,同时获取的商品总价值最大。 输入格式: · 第一行包含两个整数 n 和 W,分别表示商品种类的数量和购物车的最大承重(n和W中间使用一个空格隔开)。接下来的 n行,每行包含三个整数vi、wi、mi,分别表示第 i 种商品的价值、重量和数量(每一行的vi、wi、mi中间使用一个空格隔开,mi后不可有空格)。
输出格式: 输出一个整数,表示在不超载的情况下,小明能够获取的最大商品总价值。 输入样例1: 4 20 3 9 3 5 9 1 9 4 2 8 1 3 输出样例1: 47 输入样例2: 3 8 5 3 1 9 4 2 7 2 2 输出样例2: 23
没注释的源代码
#include <iostream>
using namespace std;
int my_max(int a, int b) {
return a > b? a : b;
}
int main() {
int n, W;
cin >> n >> W;
int items[100][3];
for (int i = 0; i < n; ++i) {
cin >> items[i][0] >> items[i][1] >> items[i][2];
}
int dp[101][1001];
for (int i = 0; i <= n; ++i) {
for (int j = 0; j <= W; ++j) {
if (i == 0 || j == 0) {
dp[i][j] = 0;
}
}
}
for (int i = 1; i <= n; ++i) {
int vi = items[i - 1][0];
int wi = 2 * items[i - 1][1];
int mi = items[i - 1][2];
for (int j = 1; j <= W; ++j) {
dp[i][j] = dp[i - 1][j];
for (int k = 0; k <= mi && k * wi <= j; k++) {
int temp = dp[i - 1][j - k * wi] + k * vi;
if (temp > dp[i][j]) {
dp[i][j] = temp;
}
}
}
}
cout << dp[n][W] << endl;
return 0;
}