洛谷P1833 樱花

题目背景

《爱与愁的故事第四弹·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
#include
#include
#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;
}

你可能感兴趣的:(动态规划,背包型DP)