【洛谷】【动态规划/背包】P1833 樱花

【题目描述:】

爱与愁大神后院里种了n棵樱花树,每棵都有美学值Ci。爱与愁大神在每天上学前都会来赏花。爱与愁大神可是生物学霸,他懂得如何欣赏樱花:一种樱花树看一遍过,一种樱花树最多看Ai遍,一种樱花树可以看无数遍。但是看每棵樱花树都有一定的时间Ti。爱与愁大神离去上学的时间只剩下一小会儿了。求解看哪几棵樱花树能使美学值最高且爱与愁大神能准时(或提早)去上学。

【输入格式:】

共n+1行:

第1行:三个数:现在时间Ts(几点:几分),去上学的时间Te(几点:几分),爱与愁大神院子里有几棵樱花树n。

第2行~第n+1行:每行三个数:看完第i棵树的耗费时间Ti,第i棵树的美学值Ci,看第i棵树的次数Pi(Pi=0表示无数次,Pi是其他数字表示最多可看的次数Pi)。

【输出格式:】

只有一个整数,表示最大美学值。

输入样例#1:
6:50 7:00 3
2 1 0
3 3 1
4 5 4
输出样例#1:
11

输入输出样例

【算法分析:】

01背包可以看做是只有一件物品的多重背包,所以可将三类背包问题化为两类:

  1. 多重背包
  2. 完全背包

但多重背包直接做时间复杂度太大,所以需要二进制优化,此时如何处理完全背包问题?

可以将完全背包的数量看做一个比较大,而数组中也存的开的数,比如9999,然后当做多重背包来做.

【代码:】

 1 //P1833 樱花
 2 #include<iostream>
 3 #include<cstdio>
 4 using namespace std;
 5
 6 const int MAXN = 1000000 + 1;
 7 const int INF = 9999;
 8
 9 int n, T;
10 int t[MAXN], c[MAXN], p[MAXN];
11 int a[MAXN], b[MAXN], f[MAXN];
12 struct Time {
13     int h, min;
14 }s, e;
15
16 inline int read() {
17     int x=0, f=1; char ch=getchar();
18     while(ch<‘0‘ || ch>‘9‘) {
19         if(ch == ‘-‘) f = -1;
20         ch = getchar();
21     }
22     while(ch>=‘0‘ && ch<=‘9‘)
23         x=(x<<3) + (x<<1) + ch-48, ch = getchar();
24     return x * f;
25 }
26
27 int main() {
28     s.h = read(), s.min = read();
29     e.h = read(), e.min = read();
30     n = read();
31     T = e.min - s.min + (e.h - s.h) * 60;
32     int cnt = 0;
33     for(int i=1; i<=n; ++i) {
34         t[i] = read(), c[i] = read(), p[i] = read();
35         if(!p[i]) p[i] = INF;
36         int s = 1;
37         while(p[i] > s) {
38             a[++cnt] = t[i] * s;
39             b[cnt] = c[i] * s;
40             p[i] -= s;
41             s <<= 1;
42         }
43         if(p[i]) {
44             a[++cnt] = t[i] * p[i];
45             b[cnt] = c[i] * p[i];
46         }
47     }
48     for(int i=1; i<=cnt; ++i)
49         for(int j=T; j>=a[i]; --j)
50             f[j] = max(f[j], f[j - a[i]] + b[i]);
51     printf("%d\n", f[T]);
52 }

原文地址:https://www.cnblogs.com/devilk-sjj/p/9065567.html

时间: 2024-11-02 23:20:50

【洛谷】【动态规划/背包】P1833 樱花的相关文章

洛谷——动态规划

1.P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师在此吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目. 聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m次以后,又回到小蛮手里.两种传球方法

洛谷P1941 飞扬的小鸟 动态规划

洛谷P1941 飞扬的小鸟 动态规划 这道题主要要注意一下飞到m以上之后高度还是 m 这个就要在判断一下 比较直接暴力的动归 是 O(N^3) f[ i ][ j ] 到 i ,j 这个位置 所需要的最少点击次数 如果不能到,就是无限大 f[ i ][ j ] = min(f[ i-1 ][ j-up[i-1] ] +1 , f[ i-1 ][ j+down[i-1] ] ) 因为可以向上飞无限次 这其实就相当于是无限背包 然后 f[ i ][ j ] 就可以从 f[ i ][ j-up[ i-

洛谷P1450 [HAOI2008]硬币购物 动态规划 + 容斥原理

洛谷P1450 [HAOI2008]硬币购物 动态规划 + 容斥原理 1.首先我们去掉限制 假设 能够取 无数次 也就是说一开始把他当做完全背包来考虑 离线DP 预处理 复杂度 4*v 用f[ i ] 表示 空间 为 i 的方案数 答案ans 其实就是所有方案 - 所有超过限制的方案 限制指的就是题目中限制 某个硬币有几枚 然后所有超过限制的方案用容斥来做 所有超过限制的方案 要减 == -1 超过限制的方案 - 2 超过限制的方案 - 3 超过限制的方案 - 4 超过限制的方案 + 1和2 超

洛谷P1586 四方定理 动态规划 + 离线

洛谷P1586 四方定理动态规划 + 离线 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ; 4 5 const int N = 35011 ; 6 int n,T,ans ; 7 int f[5][N],a[211] ; 8 9 inline int read() 10 { 11 int x = 0 , f = 1 ; 12 char ch = ge

洛谷P1133 教主的花园 动态规划

洛谷P1133 教主的花园动态规划 这里是环状的,但是我们并不用将他破环成链 只要枚举第一个点 根据第一个点选择最后一个选择什么就行了 然后我们进行DP注意如果当前是 2 的话要分情况 上一次是上升 1 还是下降 0 F1[ i ] 表示 第 i 位置的种第 1 种树所能获得的最大价值 F2[ i ][ 0 ] 表示 第 i 位置的 种第 2 种树 且上次是下降 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=

洛谷P1077 摆花 动态规划

洛谷P1077 摆花 DP   划分类动态规划 dp[ i ][ j ] 表示  到 第 i 种花,所有花总共取了 j 盆,总共的方案数 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip>

【基础练习】【背包DP】洛谷1164 小A点菜题解

洛谷的题目又有那令人···的悲剧格式= = 洛谷1164 小A点菜 本题地址:http://www.luogu.org/problem/show?pid=1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩M元(M<=10000). 餐馆虽低端,但是菜品种类不少,有N种(N<=100),第i种

洛谷P1850 换教室 最短路 + 动态规划

洛谷P1850 换教室最短路 + 动态规划 题解 首先预处理出任意两点的最短路 然后 dp f[ i ][ j ][ 0/1 ] 现在是 第 i 个时间段,已经申请 过 j次了,该次是否成功 0 否 1 成功 的最小的期望 主要是四个方面的转移 前一个是否申请 成功 or失败 当前是否申请 成功or失败 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ;

【日常学习】【背包DP(完全背包)】洛谷1616 疯狂的采药题解

这是一道典型的完全背包题目 先上题目···于是又要迎来洛谷那令人不知道说什么的霸气摘要··· 洛谷1616 疯狂的采药 本题地址:http://www.luogu.org/problem/show?pid=1616 题目背景 此题为NOIP2005普及组第三题的疯狂版. 此题为纪念LiYuxiang而生. 题目描述 LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞