
P1417 烹调方案
依然是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
具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
#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 { 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]);
cout<<ans<<endl; return 0; }
|
近期评论