牛客 美味菜肴(背包)

容易看出是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

 

posted @ 2020-05-19 11:58  朝暮不思  阅读(140)  评论(0编辑  收藏  举报