题目大意
有n样食物,每样食物有a,b,c三个属性,每种食物再t时完成获得a-t*b的美味指数,每种食物加工需c时。现给定n,总时长t,以及每种食物的三个属性,求获得的最大美味指数。
分析
一看到题目,01背包的模型。不同的是,01背包物品枚举从1~n是没有影响的,而这道题,完成时间不同,价值也不同,所以先用贪心找出最优的选取方案。
对于食物与
食物,假定再它们前面所用时间为t,若A前B后,则美味指数和为
若B前A后,则为
可以观察到,两行式子只有最后的不同,所以就按此排序。然后就是普通的01背包了。还有,答案不一定是f[t],为f[0..t]的最大值。
代码
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct node {
long long a,b,c;
}it[55];
int t,n;
long long f[100005],ans=0;
bool cmp(const node& x,const node& y) {
return x.c*y.b<y.c*x.b;
}
int main() {
scanf("%d%d",&t,&n);
for (int i=1;i<=n;i++) scanf("%lld",&it[i].a);
for (int i=1;i<=n;i++) scanf("%lld",&it[i].b);
for (int i=1;i<=n;i++) scanf("%lld",&it[i].c);
sort(it+1,it+n+1,cmp);
for (int i=1;i<=n;i++)
for (int j=t;j>=it[i].c;j--)
f[j]=max(f[j-it[i].c]+it[i].a-j*it[i].b,f[j]);
for (int i=0;i<=t;i++)
ans=max(ans,f[i]);
printf("%lld",ans);
return 0;
}