分数规划问题的定义
分数规划的处理方法
例题:
思路:我们会发现这题是让求才艺和体重的最大值,我们很明显的发现其有点像分数规划,我们的式子可以转变为ti/wi>=mid,mid是我们的可能最大值,我们可以将wi作为体重,ti-mid*wi作为新的值,我们可以用动态规划来来处理,dp[i]表示体重为i的时候,最大的价值,我们用动态规划+二分就能完美决绝问题了
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, W;
int w[255];
int t[255];
int dp[1005];
bool check(int mid)
{
fill(dp, dp + W + 1, -1e18);
dp[0] = 0;
for (int i = 1; i <= n; i++)
{
for (int j = W; j >= 0; j--)
{
if (dp[j] == -1e18)
continue;
int k = min(W, j + w[i]);
dp[k] = max(dp[k], dp[j] + t[i] - mid * w[i]);
}
}
return dp[W] >= 0;
}
signed main()
{
cin >> n >> W;
for (int i = 1; i <= n; i++)
{
cin >> w[i] >> t[i];
t[i] *= 1000;
}
int l = 0, r = 1e9;
int ans = 0;
while (l <= r)
{
int mid = (l + r) / 2;
if (check(mid))
{
ans = mid;
l = mid + 1;
}
else
{
r = mid - 1;
}
}
cout << ans << "\n";
return 0;
}