洛谷P1833 樱花

来源:互联网 发布:网络深度检测方法 编辑:程序博客网 时间:2024/04/27 22:36

题目背景

《爱与愁的故事第四弹·plant》第一章。

题目描述

爱与愁大神后院里种了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 32 1 03 3 14 5 4
输出样例#1: 
11

说明

100%数据:Te-Ts<=200,n<=30

样例解释:赏第一棵樱花树一次,赏第三棵樱花树2次

简单的混合背包。。。

注意时间的处理。

附代码:

#include<iostream>#include<algorithm>#include<cstdio>#define MAXN 50#define MAXM 1010using namespace std;int n,m,t[MAXN],c[MAXN],p[MAXN],f[MAXM];inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w;}void work(){for(int i=1;i<=n;i++){t[i]=read();c[i]=read();p[i]=read();}for(int i=1;i<=n;i++){if(p[i]==0){for(int j=t[i];j<=m;j++)f[j]=max(f[j],f[j-t[i]]+c[i]);}else{for(int k=1;k<=p[i];k++)for(int j=m;j>=t[i];j--)f[j]=max(f[j],f[j-t[i]]+c[i]);}}printf("%d\n",f[m]);}int main(){int a,b,d,e;a=read();b=read();d=read();e=read();n=read();m=(d-a)*60+(e-b);work();return 0;}