#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;
}
标签:Talent,cow,Show,int,USACO18OPEN,dp
From: https://www.cnblogs.com/sheepcsy/p/16878572.html