依然是01背包。这道题跟之前HDU的那道merchant很像,都是要先算一个不等式,再根据这个不等式进行排序,然后再进行01背包。具体而言,是要解下面这个不等式:
a1 - (t0 + c1) x b1 + a2 - (t0 + c1 + c2) x b2 > a2 - (t0 + c2) x b2 +a1 - (t0 + c1 + c2) x b1
==> b2 c1 < b1 c2
具体代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mst(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
struct food{
ll a,b,c;
};
food arr[55];
ll dp[maxn];
bool cmp(food fa,food fb)
{
return (fb.b)*(fa.c)<(fa.b)*(fb.c);
}
int main()
{
ll t,n;
mst(dp,0);
cin>>t>>n;
for(ll i=0;i<n;i++) cin>>arr[i].a;
for(ll i=0;i<n;i++) cin>>arr[i].b;
for(ll i=0;i<n;i++) cin>>arr[i].c;
sort(arr,arr+n,cmp);
for(ll i=0;i<n;i++){
for(ll j=t;j>=arr[i].c;j--){
ll val=(arr[i].a)-(arr[i].b)*j;
dp[j]=max(dp[j],dp[j-arr[i].c]+val);
}
}
ll ans=-1;
for(ll j=0;j<=t;j++)
ans=max(ans,dp[j]);
// ans=dp[t];
cout<<ans<<endl;
return 0;
}