蓝桥杯5130 健身

问题描述

小蓝要去健身,他可以在接下来的 1∼n 天中选择一些日子去健身。

他有 m 个健身计划,对于第 i 个健身计划,需要连续的 天,如果成功完成,可以获得健身增益 si​ ,如果中断,得不到任何增益。

同一个健身计划可以多次完成,也能多次获得健身增益,但是同一天不能同时进行两个或两个以上的健身计划。

但是他的日程表中有 q 天有其他安排,不能去健身,问如何安排健身计划,可以使得 n 天的健身增益和最大。

输入格式

第一行输入三个整数 n,m,q 。

第二行输入 q 个整数,t1,t2,t3...tq​ ,代表有其他安排的日期。

接下来 m 行,每行输入两个整数 ki,si​ 。代表该训练计划需要 天,完成后可以获得 si​ 的健身增益。

输出格式

一个整数,代表最大的健身增益和。

样例输入

复制代码
10 3 3
1 4 9
0 3
1 7
2 20

样例输出

复制代码
30

说明

在样例中 2∼3 天进行计划 2 ,5∼8 天进行计划 3 , 10∼10 天进行计划 1 。

评测数据范围

数据范围: 1≤q≤n≤2× , 1≤m≤50 , 1≤si≤ , 0≤ki≤20 , 1≤t1<t2<...<tq≤n 。

完全背包问题,枚举空闲段天数,每一段使用完全背包

问题转化
  • 每个健身计划 i 是一个"物品":

    • 体积v[i](需要的天数)。

    • 价值w[i](健身增益)。

  • 背包容量day[k](当前区间的可用天数)。

  • 目标 :在不超过 day[k] 的情况下,选择若干健身计划(可重复),使总价值最大。

状态转移
  • f[j] = max(f[j], f[j - v[i]] + w[i])

    • f[j]:不选当前计划。

    • f[j - v[i]] + w[i]:选当前计划,剩余天数 j - v[i] 的最优解加上当前价值。

cpp 复制代码
#include<iostream>
#include<cmath>
#include<algorithm>

#define int long long
using namespace std;

const int N = 2e5+10;
int n, m, q;
int k[N];
int t[N];  //存储由其他安排的日期  
int v[N], w[N];
int day[N];  //day[i]:第i个区间的可用天数
int dp[N];  //dp[i]:表示用 i 天能获得的最大增益
int ans;

signed main()
{
	cin>>n>>m>>q;
	for(int i=1; i<=q; ++i) cin>>t[i];
	for(int i=1; i<=m; ++i) cin>>k[i]>>w[i];
	
	//计算每个区间的可用天数
	t[0]=1, t[q+1]=n;  //为了计算day[i]赋的值 
	for(int i=q+1; i>0; --i)
	{
		if(i==1 || i==q+1) day[i] = t[i] - t[i-1];
		else day[i] = t[i] - t[i-1]-1;
	} 
	
	//计算每个健身计划需要的连续天数 
	for(int i=1; i<=m; ++i)
	{
		v[i]= pow(2, k[i]);
	}
	
	for(int i=1; i<=q+1; ++i)  //遍历每个可健身区间
	{
		for(int j=1; j<=m; ++j)  //遍历每个健身计划
		{
			for(int p=v[j]; p<=day[i]; ++p)
			{
				dp[p] = max(dp[p], dp[p-v[j]] + w[j]);
			}
		}
		ans += dp[day[i]];
	}
	
	cout<<ans;
	
	return 0;
}
相关推荐
咚咚轩2 天前
蓝桥杯19682 完全背包
动态规划·完全背包
Dream it possible!1 个月前
LeetCode 热题 100_完全平方数(84_279_中等_C++)(动态规划(完全背包))
c++·leetcode·动态规划·完全背包
今天也要早睡早起1 个月前
代码随想录算法训练营Day32| 完全背包问题(二维数组 & 滚动数组)、LeetCode 518 零钱兑换 II、377 组合总数 IV、爬楼梯(进阶)
数据结构·c++·算法·leetcode·动态规划·完全背包
菠菠萝宝3 个月前
【代码随想录】第九章-动态规划(上)
算法·动态规划·01背包·完全背包·多重背包·上楼梯
灰阳阳5 个月前
完全背包_模板题
java·算法·动态规划·完全背包
逝去的秋风9 个月前
【代码随想录训练营第42期 Day38打卡 - 动态规划Part6 - LeetCode 322. 零钱兑换 279.完全平方数 139.单词拆分
leetcode·动态规划·完全背包
Dearingxxx1 年前
蓝桥杯 经典算法题 求解完全背包问题
算法·职场和发展·蓝桥杯·dp·完全背包
✿ ༺ ོIT技术༻1 年前
DP:完全背包+多重背包问题
数据结构·算法·动态规划·完全背包·多重背包
感觉画质不如…原神1 年前
[蓝桥杯 2017 省 AB] 包子凑数
蓝桥杯·完全背包·裴蜀定理