首页 > 其他分享 >P1833 樱花 (混合背包)

P1833 樱花 (混合背包)

时间:2022-10-24 16:26:07浏览次数:71  
标签:樱花 le int 大神 P1833 leq 背包 樱花树 dp

image

樱花

题目背景

《爱与愁的故事第四弹·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\) 次。

解析

显然的混合背包问题,对于观看次数无限制的用完全背包,对于有限制的则用多重背包。

代码

#include <bits/stdc++.h>
using namespace std;
int dp[1001], t[10001], c[10001], p[10001];
int n, T, t1, t2, t3, t4;
char s;
int main() {
	cin >> t1 >> s >> t2 >> t3 >> s >> t4;
	T = 60 * (t3 - t1) + t4 - t2;
	cin >> n;
	for (int i = 1; i <= n; i ++) scanf("%d %d %d", &t[i], &c[i], &p[i]);
	for (int i = 1; i <= n; i ++) {
		if (p[i] == 0)//完全背包 
			for (int j = t[i]; j <= T; j ++) dp[j] = max(dp[j], dp[j - t[i]] + c[i]);
		else {//多重背包(二进制拆分) 
			for (int x = 1; x <= p[i]; p[i] -= x, x <<= 1){
				for (int j = T; j >= x * t[i]; j --)
					dp[j] = max(dp[j], dp[j - x * t[i]] + x * c[i]);
			}
			if (p[i]) for (int j = T; j >= p[i] * t[i]; j --)
				dp[j] = max(dp[j], dp[j - p[i] * t[i]] + p[i] * c[i]);
		}
	}
	cout << dp[T];
	return 0;
}

注意这段代码中的p[i]-=x, x<<=1不能交换位置,不然就RE了(出现负数)。

for (int x = 1; x <= p[i]; p[i] -= x, x <<= 1)

image

标签:樱花,le,int,大神,P1833,leq,背包,樱花树,dp
From: https://www.cnblogs.com/YHxo/p/16821791.html

相关文章

  • 01背包问题-简单1
    //0·1背包问题---采药.cpp---洛谷1048#include<iostream>#include<algorithm>#include<iomanip>usingnamespacestd;constintN=1e3+10;intTime[1001];......
  • 0-1背包问题代码
    一、什么是01背包问题?        举个例子,你要去一个水果摊拿水果,每种水果都有对应的两种属性:占用的体积V和蕴含的价值W。而你的背包体积为N。老板说:每种水果只能拿......
  • 分组背包问题
    [NOIP2006]金明的预算方案https://ac.nowcoder.com/acm/problem/16671题目描述金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞......
  • 动态规划实现0-1背包客问题
    #include<iostream>usingnamespacestd;//动态规划实现0-1背包客问题#defineC40#defineMYNUM10//第0个不算物品,实际有n-1个物品intm[MYNUM][C];typedefstru......
  • POJ-1276-Cash Machine(多重背包)
    CashMachineTimeLimit:1000MSMemoryLimit:10000KTotalSubmissions:30568Accepted:11018DescriptionABankplanstoinstallamachineforca......
  • acwing 分组背包问题
    题面有N组物品和一个容量是V的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是vij,价值是wij,其中i是组号,j是组内编号。求解将哪些物品......
  • acinwg 多重背包问题 I
    题面有N种物品和一个容量是V的背包。第i种物品最多有si件,每件体积是vi,价值是wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输......
  • acinwg 多重背包问题 II
    题面有N种物品和一个容量是V的背包。第i种物品最多有si件,每件体积是vi,价值是wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输......
  • acwing 混合背包问题
    题面有N种物品和一个容量是V的背包。物品一共有三类:第一类物品只能用1次(01背包);第二类物品可以用无限次(完全背包);第三类物品最多只能用si次(多重背包);每种体积是v......
  • acwing 二维费用的背包问题
    题面有N件物品和一个容量是V的背包,背包能承受的最大重量是M。每件物品只能用一次。体积是vi,重量是mi,价值是wi。求解将哪些物品装入背包,可使物品总体积不超过背......