AcWing 4877. 最大价值
有一个容量为 n的背包和 m+1种物品,每种物品都有无限多个。
物品种类编号为 0∼m。
第 i 种物品的体积为 vi,价值为 wi。
在使用背包装入物品时,每种物品的限重如下:
第 00 种物品:重量忽略不计,在装入时没有重量限制。
第 1∼m种物品:第 i种物品的单个重量为 hi,如果该种物品的装入总重量超过 li,则视为超重。
现在,请你挑选物品装入背包,要求
所有装入物品的总体积不得超过背包容量。
所有存在重量限制的物品均不得超重。
满足以上所有条件的前提下,所有装入物品的总价值尽可能大。
输出总价值的最大可能值。
注意审题,不要将 n,m的含义弄混。
输入格式
第一行包含四个整数 n, m, v0, w0。
接下来 m行,每行包含四个整数 li,hi,vi,wi。
输出格式
一个整数,表示总价值的最大可能值。
数据范围
前 4 个测试点满足 1≤n≤100,1≤m≤2。
所有测试点满足 1≤n≤1000,1≤m≤10,1≤li,hi,vi,wi≤100。
输入样例1:
10 2 2 1
7 3 2 100
12 3 1 10
输出样例1:
241
输入样例2:
100 1 25 50
15 5 20 10
输出样例2:
200
和多重背包特别像,s就是l / h;n++就行了acwing5
#include <bits/stdc++.h>
#pragma GCC optimize (2)
using namespace std;
const int INF = 1e9;
const int N = 2110;
int n, m;
int v[N], w[N], s[N];
int f[N][N];
int main()
{
cin >> m >> n;
cin >> v[1] >> w[1];
s[1] = INF;
//n++;
for(int i = 2; i <= n + 1; i++) {
int l, h;
cin >> l >> h >> v[i] >> w[i];
s[i] = l / h;
}
for(int i = 1; i <= n + 1; i++)
{
for(int j = 0; j <= m; j++)
{
for(int k = 0; k <= s[i] && k * v[i] <= j; k++)
f[i][j] = max(f[i][j], f[i - 1][j - v[i] * k] + w[i] * k);
}
}
cout << f[n + 1][m] << endl;
return 0;
}