[USACO18OPEN] Talent Show G

[USACO18OPEN] Talent Show G

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f,N = 255,WN = 1010;
int n,W;
struct name{
	int w,t;
	double y;
}cow[N];
double dp[WN];         // dp[i] : 背包容量为i时的最大价值(y值之和)
bool check(double x){ // 0/1背包验证
	int i,j;
	for(i=1;i<=n;i++) cow[i].y=(double)cow[i].t-x*cow[i].w;
	for(i=1;i<=W;i++) dp[i]=-inf;
	dp[0]=0;
	for(i=1;i<=n;i++)
		for(j=W;j>=0;j--)
			if(j+cow[i].w>=W)
				dp[W]=max(dp[W],dp[j]+cow[i].y);//若总重量大于W,全当作W
			else 
				dp[j+cow[i].w]=max(dp[j+cow[i].w],dp[j]+cow[i].y);
	return dp[W]<0;
}
int main(){
	scanf("%d%d",&n,&W);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&cow[i].w,&cow[i].t);
	double L=0,R=0;
	for(int i=1;i<=n;i++) R+=cow[i].t;
	for(int i=0;i<=50;i++){
		double mid=(L+R)/2;
		if(check(mid)) R=mid;
		else L=mid;
	}
	cout<<(int)(L*1000)<<endl;
	return 0;
}
posted @ 2022-11-10 19:44  羊扬羊  阅读(25)  评论(0编辑  收藏  举报