算是一道裸的0-1分数规划,0-1规划正确性的证明请参考OI论文《最小割模型在信息学竞赛中的应用》,里面非常详细。
总之,就是枚举比例,求a-bx的最大值,由于最多可以删去k个物品,实际就是保留n-k个,然后就在n个物品中选出最大的n-k个物品,然后再看剩下的物品里面权值为正就加进来,最后,看ans是否等于0
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 double a[1005],b[1005]; 6 const double eps=1e-8; 7 int n,r; 8 double solve(double x) 9 { 10 double temp[1005],ans=0; 11 for(int i=0;i<n;i++) 12 temp[i]=100*a[i]-x*b[i]; 13 sort(temp,temp+n); 14 for(int i=0;i<r;i++) 15 ans+=temp[n-i-1]; 16 for(int i=r;i<n&&temp[n-i-1]>-eps;i++) 17 ans+=temp[n-i-1]; 18 return ans; 19 } 20 int main() 21 { 22 while(scanf("%d%d",&n,&r)) 23 { 24 if(!(n||r)) 25 break; 26 r=n-r; 27 for(int i=0;i<n;i++) 28 scanf("%lf",a+i); 29 for(int i=0;i<n;i++) 30 scanf("%lf",b+i); 31 double ll=0,rr=100,mid; 32 while(rr-ll>eps) 33 { 34 mid=(ll+rr)/2.0; 35 if(solve(mid)>eps) 36 ll=mid; 37 else 38 rr=mid; 39 } 40 printf("%.0lf\n",ll); 41 } 42 return 0; 43 }