#洛谷 1417 dp

传送门

挺有趣的一道dp题目,看上去接近于0/1背包,但是考虑到取每个点时间不同会对最后结果产生影响,因此需要进行预处理

对于物品x和物品y,当时间为p时,先加x后加y的收益为 a[x]-(p+c[x])*b[x]+a[y]-(p+c[x]+c[y])*by

而先加y再加x的收益为 a[y]-(p+c[y])*b[y]+a[x]-(p+c[y]+c[x])*bx

化简这两个式子,不难发现对于x和y,如果满足 c[x]*b[y]<c[y]*b[x] ,那么x 一定优于 y

由以上推论即可得解,对于题目中所给的物品,将其按照以上顺序排序,在进行0/1背包,即可得解

#include <cstdio>
#include <cstring>
#include <algorithm> const int maxn = 100000 + 100;
struct data {
long long ai, bi, ci;
};
data p[60];
long long dp[maxn];
int t, n; bool cmp(data aa, data bb) {
return (aa.ci * bb.bi < aa.bi * bb.ci);
} int main () {
scanf("%d %d", &t, &n);
for (int i = 1; i <= n; i++) scanf("%lld", &p[i].ai);
for (int i = 1; i <= n; i++) scanf("%lld", &p[i].bi);
for (int i = 1; i <= n; i++) scanf("%lld", &p[i].ci);
std :: sort(p + 1, p + n + 1, cmp);
for (int i = 1; i <= n; i++)
for (int j = t; j >= p[i].ci; j--)
dp[j] = std :: max(dp[j], dp[j - p[i].ci] + (p[i].ai - j * p[i].bi));
long long ans = 0;
for (int i = 1; i <= t; i++) ans = std :: max(ans, dp[i]);
printf("%lld", ans); return 0;
}

当时做这题时想尝试多次贪心取最优值的办法,,然而,最后只得了30分,虽然尝试未成功,但是面对贪心题目时,这也不失为一种方法

附上乱搞代码

#include <cstdio>
#include <cstring>
#include <algorithm> const int maxn = 50 + 10;
int T, n;
struct data {
int ai;
int bi;
int ci;
};
data p[maxn];
int dp[100000 + 10]; bool cmp1(data aa, data bb) {
return(aa.bi < bb.bi);
}
bool cmp2(data aa, data bb) {
return (aa.ci < bb.ci);
}
bool cmp3(data aa, data bb) {
return (aa.ai > bb.ai);
} bool cmp4(data aa, data bb) {
return (aa.bi * aa.ci < bb.bi * bb.ci);
} int main () {
scanf("%d %d", &T, &n);
for (int i = 1; i <= n; i++) scanf("%d", &p[i].ai);
for (int i = 1; i <= n; i++) scanf("%d", &p[i].bi);
for (int i = 1; i <= n; i++) scanf("%d", &p[i].ci);
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = T; j >= p[i].ci; j--) {
dp[j] = std :: max(dp[j],dp[j - p[i].ci] + (p[i].ai - j * p[i].bi));
}
}
for (int i = 1; i <= T; i++) ans = std :: max(ans, dp[i]);
std :: sort(p + 1, p + n + 1, cmp1);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = T; j >= p[i].ci; j--) {
dp[j] = std :: max(dp[j],dp[j - p[i].ci] + (p[i].ai - j * p[i].bi));
}
}
for (int i = 1; i <= T; i++) ans = std :: max(ans, dp[i]);
std :: sort(p + 1, p + n + 1, cmp2);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = T; j >= p[i].ci; j--) {
dp[j] = std :: max(dp[j],dp[j - p[i].ci] + (p[i].ai - j * p[i].bi));
}
}
for (int i = 1; i <= T; i++) ans = std :: max(ans, dp[i]);
std :: sort(p + 1, p + n + 1, cmp3);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = T; j >= p[i].ci; j--) {
dp[j] = std :: max(dp[j],dp[j - p[i].ci] + (p[i].ai - j * p[i].bi));
}
}
for (int i = 1; i <= T; i++) ans = std :: max(ans, dp[i]);
std :: sort(p + 1, p + n + 1, cmp4);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
for (int j = T; j >= p[i].ci; j--) {
dp[j] = std :: max(dp[j],dp[j - p[i].ci] + (p[i].ai - j * p[i].bi));
}
}
for (int i = 1; i <= T; i++) ans = std :: max(ans, dp[i]);
printf("%d", ans);
return 0;
}

洛谷1417 烹调方案 dp 贪心的更多相关文章

  1. [洛谷P1417 烹调方案]贪心+dp

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3211Dream City Time Limit: 1 Second     ...

  2. 洛谷 P1417 烹调方案

    题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...

  3. 洛谷P1417 烹调方案

    题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...

  4. 洛谷P1417 烹调方案【dp】

    题目:https://www.luogu.org/problemnew/show/P1417 题意: 一道菜有$a,b,c$三个值.烧一道菜的时间是$c$.得到的价值是,$a-t*b$其中$t$是菜完 ...

  5. 洛谷 P1417 烹调方案 (01背包拓展)

    一看到这道题就是01背包 但是我注意到价值和当前的时间有关. 没有想太多,直接写,0分 然后发现输入方式不对-- 改了之后只有25分 我知道wa是因为时间会影响价值,但不知道怎么做. 后来看了题解,发 ...

  6. 洛谷 P1417 烹调方案 题解

    题面 这道题是一道典型的排序dp a[i]−b[i]∗(t+c[i])+a[j]−b[j]∗(t+c[i]+c[j]) a[j]−b[j]∗(t+c[j])+a[i]−b[i]∗(t+c[i]+c[j ...

  7. 洛谷 P1417烹调方案

    题目大意: 一共有n件食材,每件食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间. 求最大美味指数之和. 分析: 显然的0/ ...

  8. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  9. NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp

    原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html 题目传送门 - 洛谷P3959 题目传送门 - Vijos P2032 题意 给定一个 ...

随机推荐

  1. asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值

    asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...

  2. 【推荐】你必须知道的EF知识和经验

    阅读目录   推荐MiniProfiler插件 数据准备 foreach循环的陷进 AutoMapper工具 联表查询统计 性能提升之AsNonUnicode 性能提升之AsNoTracking 多字 ...

  3. ZOJ 3203

    很简单的一题,注意墙上的影子是放大就行.用三分. #include <iostream> #include <cstdio> #include <cstring> ...

  4. [Angular] Upgrade existing Angular app to Progressive Web App

    If you alread have an existing Angular application and want to upgrade to progressive web app. 1. In ...

  5. Linux内核project导论——网络:Netfilter概览

    简单介绍 最早的内核包过滤机制是ipfwadm.后来是ipchains.再后来就是iptables/netfilter了. 再往后,也就是如今是nftables. 只是nftables与iptable ...

  6. ListView的adapter中getView方法一直调用

    当ListView的高度不定(比如重写ListView搞成可自己主动的扩展的ListView)或 ListView嵌套在SrollView(高度不定)中,listView中的一个item元素改变会使得 ...

  7. mysqil操作数据库

    mysqil操作数据库 每次用到mysql_connect连接数据库的时候都会提示: 1 Deprecated: mysql_connect(): The mysql extension is dep ...

  8. 谷歌开源可视化工具Facets,将用于人+AI协作项目研究——无非就是一个用于特征工程探索的绘图工具集,pandas可以做的

    见:http://www.infoq.com/cn/news/2017/07/goole-sight-facets-ai https://github.com/PAIR-code/facets/blo ...

  9. NESTED LOOPS & HASH JOIN & SORT MERGE JOIN

    表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...

  10. Qt-信号和槽-1对1

    前言:信号和槽是Qt的核心机制,窗体和控件对象之间的沟通一般都使用信号和槽. 对于部件有哪些信号和槽,可以查看help文档. 一.使用自定义槽 1.1 新建工程 新建工程,新建Widget类(基于QW ...