【题解】#2757. 「JOI 2014 Final」IOI 馒头

12 篇文章 0 订阅
5 篇文章 0 订阅

题目描述

译自 JOI 2014 Final T2「IOI 饅頭」

有 M 种互不相同的馒头各一个,第 i 个馒头卖 Pi元。

有 N 个包装盒,第 j 个包装盒最多能装 Ci 个馒头,买第 j 个包装盒的花费为 Ej 元。要求只能将一些馒头放进包装盒中打包出售,不能零售,当然也可以不出售某些馒头(卖剩的馒头被出题人吃了,出题人还吃得津津有味~)。售出一盒馒头得到的利润为盒内所有馒头的价格减去包装盒的价格。

现在买下(这 N 个包装盒)其中的一些包装盒(也可以不买,还可以全买),将馒头打包出售,求最大可能利润。

输入格式

第一行两个正整数M,N ,意义如题目描述;
接下来 M 行,每行一个正整数Pi ,表示第 i 个馒头的价格;
接下来 N 行,每行两个正整数Cj,Ej ,表示第 j 个包装盒最多能装 Cj 个馒头,花费 Ej 元。

输出格式

一行一个整数,表示最大可能利润。

样例输入

4 3
180
160
170
190
2 100
3 120
4 250

样例输出

480

样例说明

在本例中,我们选择第一、第二个包装盒,第一个包装盒装第 1,2个馒头,第二个包装盒装第 3,4 个馒头。第一盒馒头的利润是180+160-100=240 元,第二盒馒头的利润是 170+190-120=240 元,因此总利润为 240+240=480元。

思路

贪心+01背包

贪心是把馒头按价值从大到小排序,因为每个馒头的大小是一样的(可以看做1),那么打包的时候肯定是先从价值大的馒头打包
01背包,dp[i][j]表示前i个包装盒装j个馒头的最大利益

代码
#include<bits/stdc++.h>
using namespace std;
int n,m,a[10010],anss,dp[510][10010];
//dp[i][j]表示前i个包装盒装j个馒头的最大利益 
struct node{
	int c,e;
}b[510];
int cmp(int x,int y) {return x>y;}
int main()
{
	scanf("%d%d",&m,&n);
	for (int i=1;i<=m;i++) scanf("%d",&a[i]);
	sort(a+1,a+1+m,cmp); //一个贪心,很容易想到要将馒头的价值从大到小排序 
	for (int i=1;i<=m;i++) a[i]+=a[i-1]; //优化,馒头价值的前缀和 
	for (int i=1;i<=n;i++) scanf("%d%d",&b[i].c,&b[i].e);
	for (int i=1;i<=n;i++)//前i个包装盒 
	  for (int j=1;j<=m;j++) //装j个馒头 
	  {
	  	if (j<=b[i].c) dp[i][j]=max(dp[i-1][j],a[j]-b[i].e);	
	  	//如果j个馒头可以全部放进去,那么就直接放馒头进去,不用挑来挑去了
		//dp[i-1][j]表示不用第i个包装盒,直接继承第i-1个包装盒装j个馒头的利润 
	  	//a[j]-b[i].e表示j个馒头全装进去了,还要减去第i个包装盒的费用
	  	else dp[i][j]=max(dp[i-1][j],dp[i-1][j-b[i].c]+a[j]-a[j-b[i].c]-b[i].e);
	  	//dp[i-1][j]表示不用第i个包装盒,直接继承第i-1个包装盒装j个馒头的利润
	  	//dp[i-1][j-b[i].c]表示前面的包装盒装j-b[i].c个馒头的利润,剩下的b[i].c个馒头要留给第i个包装盒装 
	    //a[j]-a[j-b[i].c]表示第i个包装盒要装的 从j开始的前面b[i].c个馒头 的利润 
	    //还要减去b[i].e,也就是第i个包装盒的费用 
	    anss=max(anss,dp[i][j]); //直接在比较后寻找最大值,反正答案总会是dp[i][j]其中的一个 
	  }
	cout<<anss<<endl;
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《计算机操作系统(第4版)》学习指导与题解 含实验.pdf是一本关于计算机操作系统的学习指导和题解的电子书。这本书主要针对操作系统这个重要的计算机课程内容进行了详细的解释和讲解,对读者学习操作系统具有很大的帮助。 这本电子书的特点是结合了学习指导和题解,旨在帮助读者更好地理解和掌握操作系统的知识。书中通过讲解操作系统的基本概念、原理和技术,引导读者深入理解操作系统的工作原理和实现方法。同时,书中还提供了一些习题和实验,帮助读者巩固所学的知识,提升操作系统的实践能力。 这本电子书的内容丰富全面,涵盖了操作系统的各个方面。包括进程管理、内存管理、文件系统、输入输出管理等内容。每个章节都有详细的解释和示例,配有相关的习题和实验,可以帮助读者更好地理解和运用所学的知识。 对于计算机专业的学生和从事计算机相关工作的技术人员来说,这本电子书是一本很好的学习资料。通过学习这本书,读者可以全面了解和掌握操作系统的知识,提高自己的技能水平。同时,这本电子书还适合作为操作系统相关课程的参考教材,帮助教师更好地教授操作系统的知识。 总之,《计算机操作系统(第4版)》学习指导与题解 含实验.pdf 是一本内容丰富、有助于学习操作系统的电子书,对于学习操作系统或从事计算机相关工作的人士来说都是一本很有价值的学习资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值