牛客 美味菜肴(背包)
作者:互联网
容易看出是01背包,但是有个不同之处是,dp要求无后效性,而这题因为时间会影响答案,所以买的顺序是需要确定下来才能做背包dp
可以用贪心的方法,并且易证要按t/b排序。之后答案的顺序肯定是按所给的顺序取的,再做一遍01背包即可
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; const int mod=1e9+7; typedef long long ll; struct node{ ll a,b,c; bool operator <(const node &t )const{ return c*t.b<b*t.c; } }s[110]; ll b[N]; ll f[N]; int main(){ int i; int n,m,t; cin>>n>>m>>t; for(i=1;i<=n;i++){ cin>>b[i]; } for(i=1;i<=m;i++){ int j; cin>>j>>s[i].a>>s[i].c; s[i].b=b[j]; } sort(s+1,s+1+m); for(i=1;i<=t;i++) f[i]=-1e6; f[0]=0; for(i=1;i<=m;i++){ for(int j=t;j>=s[i].c;j--){ f[j]=max(f[j],f[j-s[i].c]+s[i].a-s[i].b*(j)); } } ll ans=-0x3f3f3f3f; for(i=1;i<=t;i++) ans=max(ans,1ll*f[i]); cout<<ans<<endl; }View Code
标签:背包,const,int,ll,long,牛客,01,美味 来源: https://www.cnblogs.com/ctyakwf/p/12916134.html