DP大学习
P3985 不开心的金明
0/1背包题 但1≤N≤100。1≤W≤10e9, 1≤v i≤10e9
最大价值与最小价值差不超过 3, 将所有 v i - v i_min。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e3+5, inf = 2e9+5;
int n, w, wi[N], v[N], mi = inf, sumv, f[N][N], ans;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0) , cout.tie(0);
cin >> n >> w;
for(int i=1;i<=n;i++){
cin >> v[i] >> wi[i];
mi = min(mi, v[i]);
sumv += v[i];
}
--mi;
for(int i=1;i<=n;i++) v[i] -= mi;
sumv -= mi * n;
for(int i=1;i<=n;i++){
for(int j=sumv;j>=v[i];j--){
for(int k=n;k;k--){
if(j + k*mi <= w) f[j][k] = max(f[j][k],f[j-v[i]][k-1]+wi[i]);
}
}
}
for(int i=1;i<=sumv;i++){
for(int j=1;j<=n;j++){
ans = max(ans,f[i][j]);
}
}
cout << ans;
return 0;
}

浙公网安备 33010602011771号