#洛谷 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. 环境搭建Selenium2+Eclipse+Java+TestNG_(一)

    第一步  安装JDK 第二步 下载Eclipse 第三步 在Eclipse中安装TestNG 第四步 下载Selenium IDE.SeleniumRC.IEDriverServer 第五步 下载Fi ...

  2. 各项硬件使用剖析(一)---让你一眼就能区分瓶颈是Memory、processor ORdisk!

      

  3. MyBatis中动态SQL元素的使用

    掌握MyBatis中动态SQL元素的使用 if choose(when,otherwise) trim where set foreach <SQL>和<include> 在应 ...

  4. 使用Eclipse进行远程调控

    什么是远程调试,就是在A机器上利用Eclipse单步跟踪调试B机器上的Web应用,当然调试A机器上Web应用也是没有问题的,90%我都是调试本机的Web应用,远程调试的意义我想我不用说了,大家都会想到 ...

  5. jQuery动画animate()的使用

    自己定义动画效果: 使用方法:animate(js对象,运行时间.回调函数): js对象:{ }描写叙述动画运行之后元素的样式 运行时间:毫秒数 回调函数:动画运行结束后要运行的函数 html代码: ...

  6. HDU 5078 Revenge of LIS II(dp LIS)

    Problem Description In computer science, the longest increasing subsequence problem is to find a sub ...

  7. Chromium网页输入事件捕捉和手势检測过程分析

    连续的输入事件可能会产生一定的手势操作.比如滑动手势和捏合手势. 在Chromium中,网页的输入事件是在Browser进程中捕捉的.Browser进程捕获输入事件之后,会进行手势操作检測.检測出来的 ...

  8. 0x21 剪枝

    这一章真是心态崩,剪枝太玄学啦,特别是那个搜索顺序我靠真的... poj1011 枚举答案,搜索记录当前到第几根木棒. 剪枝:1.从大到小排序 2.排除等效,这个感觉还行,就是木棒按大小顺序进去,去除 ...

  9. zzulioj--1769--去师院的旅程:能怎么走(三)(0.0)

    1796: 去师院的旅程:能怎么走(三) Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 404  Solved: 200 SubmitStatusWe ...

  10. 谷歌浏览器 —— 快捷键(vimium:像使用 vim 一样操作当前页面)

    Chrome 键盘快捷键 拷贝当前页面内的某链接: 首先输入 y(进入 yank 模式),输入 f,为当前页面内的全部超链接编号,然后输入待拷贝的链接编号,即可将该链接复制到粘贴板: 1. 使用 vi ...