博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[luoguP1417] 烹调方案(背包DP)
阅读量:5234 次
发布时间:2019-06-14

本文共 1321 字,大约阅读时间需要 4 分钟。

 

By tinylic

如果没有b[i]这个属性的话就是明显的01背包问题。

现在考虑相邻的两个物品x,y。假设现在已经耗费p的时间,那么分别列出先做x,y的代价:

a[x]-(p+c[x])*b[x]+a[y]-(p+c[x]+c[y])*b

a[y]-(p+c[y])*b[y]+a[x]-(p+c[y]+c[x])*b

对这两个式子化简,得到①>②的条件是c[x]*b[y]<c[y]*b[x].

发现只要满足这个条件的物品对(x,y),x在y前的代价永远更优。

因此可以根据这个条件进行排序,之后就是简单的01背包了。

 

然而我看这个DP方程还不是完全的01背包,应该是 f[i] 表示到时刻 i 的最优解,且时刻 i 必须得用

代码

#include 
#include
#include
#define N 100001#define LL long long#define max(x, y) ((x) > (y) ? (x) : (y))int T, n;LL ans, f[N];struct node{ LL a, b, c;}p[51];inline int read(){ int x = 0, f = 1; char ch = getchar(); for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1; for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0'; return x * f;}inline bool cmp(node x, node y){ return x.c * y.b < y.c * x.b;}int main(){ int i, j; T = read(); n = read(); for(i = 1; i <= n; i++) p[i].a = read(); for(i = 1; i <= n; i++) p[i].b = read(); for(i = 1; i <= n; i++) p[i].c = read(); std::sort(p + 1, p + n + 1, cmp); for(i = 1; i <= n; i++) for(j = T; j >= p[i].c; j--) { f[j] = max(f[j], f[j - p[i].c] + p[i].a - j * p[i].b); ans = max(ans, f[j]); } printf("%lld\n", ans); return 0;}

  

 

转载于:https://www.cnblogs.com/zhenghaotian/p/7061403.html

你可能感兴趣的文章
读书汇总贴
查看>>
微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
查看>>
MPT树详解
查看>>
空间分析开源库GEOS
查看>>
RQNOJ八月赛
查看>>
前端各种mate积累
查看>>
jQuery 1.7 发布了
查看>>
Python(软件目录结构规范)
查看>>
Windows多线程入门のCreateThread与_beginthreadex本质区别(转)
查看>>
Nginx配置文件(nginx.conf)配置详解1
查看>>
linux php编译安装
查看>>
name phone email正则表达式
查看>>
721. Accounts Merge
查看>>
OpenCv-Python 图像处理基本操作
查看>>
「Unity」委托 将方法作为参数传递
查看>>
重置GNOME-TERMINAL
查看>>
redis哨兵集群、docker入门
查看>>
hihoCoder 1233 : Boxes(盒子)
查看>>
oracle中anyData数据类型的使用实例
查看>>
C++对vector里面的元素排序及取任意重叠区间
查看>>