题目大意:一共有 n 件食材,每件食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间。众所周知,gw的厨艺不怎么样,所以他需要你设计烹调方案使得美味指数最大。

题解:这道题需要对背包问题有更加深入的理解。

可以发现,如果不进行排序操作的话,先选的物品会对后续选择的物品的价值产生影响,即:答案与选择的先后顺序有关。这与 0-1 背包问题不同,对于 0-1 背包问题来说,先选择的物品对后续物品答案的贡献没有影响,因此与选择的顺序无关。对于这种物品之间价值会相互影响的情况,首先考虑固定一个子集,对集合内的元素按某种顺序排序,扩展到整个集合来说,即:先进行排序,再进行 dp 即可。

代码如下

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=55;
const int maxx=1e5+10; int T,n;
LL dp[maxx];
struct node{int a,b,c;}t[maxn];
bool cmp(const node &x,const node &y){
return (LL)x.c*y.b<(LL)x.b*y.c;
} void read_and_parse(){
scanf("%d%d",&T,&n);
for(int i=1;i<=n;i++)scanf("%d",&t[i].a);
for(int i=1;i<=n;i++)scanf("%d",&t[i].b);
for(int i=1;i<=n;i++)scanf("%d",&t[i].c);
sort(t+1,t+n+1,cmp);
}
void solve(){
for(int i=1;i<=n;i++)
for(int j=T;j>=t[i].c;j--)
dp[j]=max(dp[j],dp[j-t[i].c]+t[i].a-(LL)t[i].b*j);
LL ans=0;
for(int i=0;i<=T;i++)ans=max(ans,dp[i]);
printf("%lld\n",ans);
}
int main(){
read_and_parse();
solve();
return 0;
}

最新文章

  1. 51nod1183(Edit Distance)
  2. Norflash控制器的Verilog建模之一
  3. 笔记007:对象——RegExp正则表达式对象
  4. curl 模拟登录微信公众平台带验证码
  5. 【转】gtk+多线程的程序实例
  6. 2016暑假多校联合---Another Meaning
  7. [译]SQL Server 之 索引基础
  8. android 学习随笔七(网络:图片及文本传输及线程关系 )
  9. GATK3.2.2小结(转载)
  10. Linux源代码编译安装tree命令
  11. WPF 心形线算法
  12. javascript的族家族史
  13. Libevent API
  14. UML 简单的总结
  15. 微信小程序教学第四章第一节(含视频):小程序中级实战教程:详情-页面制作
  16. 数据库01创建表和DML语言
  17. 测试创建表变量对IO的影响
  18. BASE64图片转字符串
  19. H5C3动画
  20. excel主题使文档更加具有专业化

热门文章

  1. 详析静态网站与动态网站区别(服务器ip dns 端口)
  2. Custom Configuration 的两种方法:2.XmlSerializer XmlAttribute
  3. java:LeakFilling(struts2)
  4. shadow使用方法
  5. JDBC操作数据库的基本操作
  6. C# 二维码、条形码生成
  7. Unity Shader 基础
  8. Docker 面试题(一)
  9. C++复习练习题:1-1000的完数
  10. python 并发编程 多路复用IO模型