bzoj 5281 [Usaco2018 Open]Talent Show——0/1分数规划
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5281
把分子乘1000,就能在整数里做了。
这种水题也花了这么久……
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define ll long long using namespace std; const int N=255,M=1005; int n,lm,v[N],c[N],l,r,mid,ans; ll a[N],dp[M]; bool check() { for(int i=1;i<=n;i++) a[i]=c[i]-(ll)mid*v[i]; memset(dp,-2,sizeof dp); dp[0]=0; for(int i=1;i<=n;i++) for(int j=lm;j>=0;j--) dp[min(lm,j+v[i])]= max(dp[min(lm,j+v[i])],dp[j]+a[i]); return dp[lm]>=0; } int main() { scanf("%d%d",&n,&lm); for(int i=1;i<=n;i++) { scanf("%d%d",&v[i],&c[i]); c[i]*=1000; r+=c[i]; } while(l<=r) { mid=l+r>>1; if(check())ans=mid,l=mid+1; else r=mid-1; } printf("%d\n",ans); return 0; }