1 条题解
-
0
这道题有个很关键的隐藏信息,就是当选择一个食物烹饪的时候,会影响下一个食物的价值,和原本01背包选择顺序和物品价值无关不对,这时候我们就需要选择一个最优的dp路线,有点类似贪心。
这里就找到了遍历的条件,就可以先对每个食物进行一个排序,确定最优的遍历路线。
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=100010; LL f[N]; int n,t; struct P { int a; int b; int c; }fd[N]; bool cmp (P x, P y) { return (LL)x.c*(LL)y.b<(LL)y.c*(LL)x.b; } int main() { cin>>t>>n; for(int i=1;i<=n;i++) cin>>fd[i].a; for(int i=1;i<=n;i++) cin>>fd[i].b; for(int i=1;i<=n;i++) cin>>fd[i].c; sort(fd+1,fd+1+n,cmp); for(int i=1;i<=n;i++) for(LL j=t;j-fd[i].c>=0;j--)//这里j得用LL { f[j]=max(f[j],f[j-fd[i].c]+fd[i].a-j*fd[i].b); } LL res=0; for(int i=1;i<=t;i++) res=max(f[i],res); cout<<res; return 0; }
- 1
信息
- ID
- 119
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 106
- 已通过
- 21
- 上传者