#洛谷 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. Windows下通过FTP自动上传和下载动态文件名

    某个项目中每天会生成一个以文件名+日期.rar文件,如bcpdata2012-08-31.rar文件,动态的部分为日期部分,在windows环境变量中用 %date:~0,10% 表示,这个文件生成后 ...

  2. mengento 数据库模型

  3. 洛谷 U249 匹配

    U249 匹配 题目描述 输入整数s和两个整数集合A和B,从这A和B中各取一个数,如果它们的和等于s,称为“匹配”.编程统计匹配的总次数 输入输出格式 输入格式: 第一行为三个整数s(0<s≤1 ...

  4. servlet3.0理解

    1.servlet是用Java编写的服务器端程序,服务器端程序,服务器端程序. 2.Servlet运行于支持Java的应用服务器中.spring mvc有自己的实现servlet 从原理上讲,Serv ...

  5. LayoutParams继承于Android.View.ViewGroup.LayoutParams.

    LayoutParams相当于一个Layout的信息包,它封装了Layout的位置.高.宽等信息.假设在屏幕上一块区域是由一个Layout占领的,如果将一个View添加到一个Layout中,最好告诉L ...

  6. tflearn中一些CNN RNN的例子

    lstm.py # -*- coding: utf-8 -*- """ Simple example using LSTM recurrent neural networ ...

  7. 云:VMware

    ylbtech-云:VMware VMware总部位于美国加州帕洛阿尔托 ,是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案,企业通过数据中心改造和公有云整合业务,借助企业安全转 ...

  8. springMVC+uploadify3.1 文件上传 demo

    uploadify3.1 api 可参考:(点击打开链接) 需要springmvc的jar包 1.upload.jsp(主要代码) <script type="text/javascr ...

  9. shell编程01—shell基础

    01.学习shell编程需要的知识储备 1.vi.vim编辑器的命令,vimrc设置 2.命令基础,100多个命令 3.基础.高端的网络服务,nfs,rsync,inotify,lanmp,sersy ...

  10. 探讨:crond 引发大量sendmail进程的解决办法

    某服务器账号comm无法登录,说是资源消耗完毕.于是用另一个账号登陆到服务器,检查common账号到底启动了哪些dd引起资源耗尽:ps -u common发现有个 sendmail的启动特别多例如:c ...