P1833

樱花

题目背景

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

题目描述

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

输入格式

\(n+1\)行:

\(1\) 行:现在时间 \(T_s\)(几时:几分),去上学的时间 \(T_e\)(几时:几分),爱与愁大神院子里有几棵樱花树 \(n\)。这里的 \(T_s\)\(T_e\) 格式为:hh:mm,其中 \(0 \leq hh \leq 23\)\(0 \leq mm \leq 59\),且 \(hh,mm,n\) 均为正整数。

\(2\) 行到第 \(n+1\) 行,每行三个正整数:看完第 \(i\) 棵树的耗费时间 \(T_i\),第 \(i\) 棵树的美学值 \(C_i\),看第 \(i\) 棵树的次数 \(P_i\)\(P_i=0\) 表示无数次,\(P_i\) 是其他数字表示最多可看的次数 \(P_i\))。

输出格式

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

样例 #1

样例输入 #1

6:50 7:00 3
2 1 0
3 3 1
4 5 4

样例输出 #1

11

提示

\(100\%\) 数据:\(T_e-T_s \leq 1000\)(即开始时间距离结束时间不超过 \(1000\) 分钟),\(n \leq 10000\)。保证 \(T_e,T_s\) 为同一天内的时间。

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

多重背包和完全背包的结合
p[i]=0相当于完全背包
其余则是多重背包 注意+价值时是+k*c[i]!
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int h1,m1,h2,m2,n;
int t[10005],c[10005],p[10005],f[1005];
signed main()
{
	ios::sync_with_stdio(false);
	char ch;
	cin>>h1>>ch>>m1;
	cin>>h2>>ch>>m2;
	cin>>n;
	int tim=(h2-h1)*60+(m2-m1);
	for(int i=1;i<=n;i++)cin>>t[i]>>c[i]>>p[i];
	for(int i=1;i<=n;i++)
	{
		if(p[i]==0)//完全背包 
		{
			for(int j=t[i];j<=tim;j++)
				f[j]=max(f[j],f[j-t[i]]+c[i]);
		}
		else
		{
			for(int j=tim;j>=0;j--)
				for(int k=0;k<=p[i];k++)
					if(j-k*t[i]>=0)
						f[j]=max(f[j],f[j-k*t[i]]+k*c[i]);
		}
	}
	cout<<f[tim]<<"\n";
	return 0;
}
posted @ 2023-01-11 21:33  PKU_IMCOMING  阅读(15)  评论(0)    收藏  举报