AcWing 5. 多重背包问题 II C
原题链接
中等
作者:
LaChimere
,
2021-06-03 15:19:56
,
所有人可见
,
阅读 271
C
#include <stdio.h>
#define MAXSIZE 2010
#define max(a,b) ((a)>(b)?(a):(b))
int N, V, dp[MAXSIZE];
void CompletePack(int v, int w) {
for (int j = v; j <= V; ++j) {
dp[j] = max(dp[j], dp[j-v] + w);
}
}
void ZeroOnePack(int v, int w) {
for (int j = V; j >= v; --j) {
dp[j] = max(dp[j], dp[j-v] + w);
}
}
int main() {
scanf("%d%d", &N, &V);
int vi, wi, si;
for (int i = 1; i <= N; ++i) {
scanf("%d%d%d", &vi, &wi, &si);
if (vi*si >= V) {
CompletePack(vi, wi);
} else {
for (int k = 1; k < si; k <<= 1) {
ZeroOnePack(k*vi, k*wi);
si -= k;
}
ZeroOnePack(si*vi, si*wi);
}
}
printf("%d\n", dp[V]);
return 0;
}