一个不一样的做法
查看原帖
一个不一样的做法
1271310
mysb楼主2025/1/20 18:48
二分dp,希望可以帮助你们
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e7;
int dp[N];
int n,m,p,t;
int a[N];
int v[N],w[N],sum=-1;
int s[N];
bool check(int x){
	for(int i=1;i<=x;i++)dp[i]=0;
	for(int i=1;i<=n;i++){
		for(int j=w[i];j<=x;j++){
			dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
		}
	}
	return dp[x]>=m;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>v[i]>>w[i];
	}
	
	int l=1,r=1e6;
	while(l<=r){
		int mid=(l+r)/2;
		if(check(mid))r=mid-1;
		else l=mid+1;
	}
	cout<<l;
	return 0;
}
2025/1/20 18:48
加载中...