01分数规划
2025-10-22 22:19:01
发布于:上海
10阅读
0回复
0点赞
给定 以及 ,求一组 ,使得:
- 最大
求这个最大值,保留三位小数。
显然是 01 分数规划。考虑二分,假设目前二分到 ,我们要判断是否有一组 ,使得 。
变形得
类似于背包问题的方程。
以 为背包大小, 为物品重量, 为物品价值,跑 01 背包即可, 即为上式中的 。
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f3f3f3f3f
#define N 300005
#define int long long
int a[N],b[N];
double w,dp[1005];
int n,W;
bool check(){
// cout<<w<<endl;
for(int i=1;i<=W;i++)
dp[i]=-0x3f3f3f3f;
for(int i=1;i<=n;i++)
for(int j=W;j>=0;j--)
if(j+b[i]>=W)
dp[W]=max(dp[W],dp[j]+(a[i]-b[i]*w));
else
dp[j+b[i]]=max(dp[j+b[i]],dp[j]+(a[i]-b[i]*w));
return dp[W]>=0;
}
signed main(){
cin>>n>>W;
for(int i=1;i<=n;i++)
cin>>b[i]>>a[i];
double l=0,r=1e7;
while(r-l>1e-10){
w=(l+r)/2;
if(check())l=w;
else r=w;
}
cout<<(int)(1000*w)<<endl;
return 0;
}
全部评论 1
%%%
1周前 来自 广东
0








有帮助,赞一个