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;
}
posted @ 2025-12-30 11:36  Gaoyxx  阅读(8)  评论(0)    收藏  举报