这个题与普通的01背包问题相比,价值不是固定的,而是随时间变化的。对于1和2两件食材,可能产生的美味值为:
a1-(t1+t2)b1+a2-t2b2 1
a1-t1*b1+a2-(t1+t2)*b2 2
要在保证美味值最大的情况下,要使a食材比b食材先做,必须满足的条件为第1个式子大于第2个式子,化简后是t1b2<t2b1。
然后我们按这个顺序排好,就保证了在最大美味值的情况下,如果选到1和2,那么1一定是在选在2前面。
就是01背包问题了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int t,n;
long long dp[100007];
struct node
{
long long st;
long long cost;
long long time;
}a[57];
bool cmp(node q,node w)
{
return q.time*w.cost<w.time*q.cost;
}
int main()
{
scanf("%d%d",&t,&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i].st);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i].cost);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i].time);
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
for(int j=t;j>=a[i].time;j--)
dp[j]=max(dp[j],dp[j-a[i].time]+a[i].st-j*a[i].cost);
long long ans=0;
for(int i=0;i<=t;i++)
ans=max(ans,dp[i]);
printf("%lld\n",ans);
return 0;
}