美味菜肴

美味菜肴

https://ac.nowcoder.com/acm/problem/14704

还是被坑了,注意菜的种类是m!!!
01背包,但注意再想想,的是,区别背包与顺序无关,这个有关。那么就找个合理的顺序。
假设i,j交换更优
ai - bi * ci + aj - bj * (ci + cj) < aj - bj *cj + ai - bi * (ci +cj )
- bj * ci < -bi * cj
bj * ci > bi * cj
排个序就行。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=0x3f;
const int maxn=2e6+9;
int t,n,m;
int f[maxn],a[maxn];
struct nod{
    int cnt,a,c;
}node[maxn];
bool cmp(nod i,nod j)
{
    return i.c*a[j.cnt]<j.c*a[i.cnt];
}
signed main()
{
    cin>>n>>m>>t;
    memset(f,-inf,sizeof(f));
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=m;i++)
    {
        cin>>node[i].cnt>>node[i].a>>node[i].c;
    }
    sort(node+1,node+1+m,cmp);
    f[0]=0;
    for(int i=1;i<=m;i++)
    {
        for(int j=t;j>=node[i].c;j--)
            f[j]=max(f[j],f[j-node[i].c]+node[i].a-j*a[node[i].cnt]);
    }
    int ans=-1e9;
    for(int i=1;i<=t;i++) ans=max(ans,f[i]);
    cout<<ans;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务