题目背景
《爱与愁的故事第四弹·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 3 2 1 0 3 3 1 4 5 4
输出样例#1:
11
说明
100%数据:Te-Ts<=200,n<=30
样例解释:赏第一棵樱花树一次,赏第三棵樱花树2次
简单的混合背包。。。
注意时间的处理。
附代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#define MAXN 50
#define MAXM 1010
using 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;
}