思路:
想到DP,但超时
考虑二分答案,设f[i][j]表示到i个人,共完成j项1,最多可以完成多少项2
c o d e code code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n, m;
int x[10100], y[10010];
int f[300][300];
bool check(int time)
{
memset(f, 128, sizeof(f));
f[0][0]=0;
for(int i=1; i<=n; i++)
for(int j=0; j<=m; j++)
for(int k=0; k<=j; k++)
if(time-k*x[i]>=0)
f[i][j]=max(f[i][j], f[i-1][j-k]+(time-k*x[i])/y[i]);
return f[n][m]>=m;
}
int main()
{
freopen("company.in", "r", stdin);
freopen("company.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
scanf("%d%d", &x[i], &y[i]);
int l=0, r=100000, ans=1e9;
while(l<=r)
{
int mid=l+r>>1;
if(check(mid))
r=mid-1, ans=min(ans, mid);
else
l=mid+1;
}
printf("%d", ans);
return 0;
}