【bzoj 5281】Talent Show(分數規劃的揹包dp驗證)

傳送門biu~

#include<bits/stdc++.h>
#define N 255
#define maxw 1005
using namespace std;
const double eps=1e-6,inf=1e6;
int n,W,w[N],t[N];
double v[N],f[maxw];
inline bool check(double x){
    for(int i=1;i<=W;++i)   f[i]=-inf;
    for(int i=1;i<=n;++i)   v[i]=t[i]-x*w[i];
    for(int i=1;i<=n;++i){
        for(int j=W;j>=W-w[i] && ~j;--j)   f[W]=max(f[W],f[j]+v[i]);
        for(int j=W-1;j>=w[i];--j)      f[j]=max(f[j],f[j-w[i]]+v[i]);
    }
    return f[W]>eps;
}
int main(){
    scanf("%d%d",&n,&W);
    for(int i=1;i<=n;++i)   scanf("%d%d",&w[i],&t[i]);
    double l=0,r=1e7;
    while(r-l>eps){
        double mid=0.5*(l+r);
        if(check(mid))  l=mid;
        else        r=mid;
    }
    printf("%d",(int)floor(1000*r));
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章