P5878
思路
可以准备的奖品数量是单调的,即如果能准备
考虑二分。将
在判断函数中,假设只有
如果是不止一件物品的话,我们只要将上述过程重复
搜完之后得到的答案即为最终答案。
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,a[101][6],f[100001],l,r;
bool check(int mid){
int ans=0;
for (int i=1;i<=n;i++){
memset(f,0,sizeof(f));bool tmp=0;
for (int j=0;j<=m;j++){
if (j>=a[i][3]) f[j]=max(f[j],f[j-a[i][3]]+a[i][2]);
if (j>=a[i][5]) f[j]=max(f[j],f[j-a[i][5]]+a[i][4]);
if (f[j]>=a[i][0]*mid-a[i][1]){
ans+=j,tmp=1;
break;
}
}
if (!tmp) return 0;
}
return ans<=m;
}
signed main(){
cin>>n>>m;
for (int i=1;i<=n;i++) cin>>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3]>>a[i][4]>>a[i][5];
l=0,r=m;
while (l<r){
int mid=(l+r+1)/2;
if (check(mid)) l=mid;
else r=mid-1;
}
cout<<l;
return 0;
}