0/1分数规划问题,用二分解决!!
代码如下:
#include<iostream> #include<stdio.h> #include<algorithm> #include<iomanip> #include<cmath> #include<cstring> #define pi acos(-1.0) using namespace std; double a[1001],b[1001],an[1001]; int main() { int i,j,k,n; double l,r,sum,mid; while(cin>>n>>k){ if(n==0&&k==0) break; for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<n;i++) cin>>b[i]; l=0.0;r=1.0; while(r-l>1e-8){ mid=(l+r)/2.0; for(i=0;i<n;i++) an[i]=a[i]-mid*b[i]; sort(an,an+n); sum=0; for(i=k;i<n;i++) sum+=an[i]; if(sum>0) l=mid; else r=mid; } printf("%.0f ",100*mid); } }