每日打卡 还剩98道题
作者:
__NULL__
,
2024-08-10 09:04:11
,
所有人可见
,
阅读 69
混合背包问题
#include<bits/stdc++.h>
using namespace std;
const int MAXX = 1e5 + 5;
int n, v, a[MAXX], b[MAXX], dp[MAXX], r1, r2, s, cnt, c[MAXX];
int main(){
cin >> n >> v;
for(int i = 1; i <= n; i++){
cin >> r1 >> r2 >> s;
if(s != 0){
if(s == -1){
s = 1;
}
int h = 1;
while(h <= s){
a[++cnt] = r1 * h;
b[cnt] = r2 * h;
c[cnt] = 1;
s -= h;
h *= 2;
}
if(s != 0){
a[++cnt] = r1 * s;
b[cnt] = r2 * s;
c[cnt] = 1;
}
}else{
a[++cnt] = r1;
b[cnt] = r2;
c[cnt] = 0;
}
}
for(int i = 1; i <= cnt; i++){
if(c[i] == 1){
for(int j = v; j >= a[i]; j--){
dp[j] = max(dp[j - a[i]] + b[i], dp[j]);
}
}else{
for(int j = a[i]; j <= v; j++){
dp[j] = max(dp[j - a[i]] + b[i], dp[j]);
}
}
}
cout << dp[v];
return 0;
}