当前位置:网站首页>2020蓝桥杯国赛B组-搬砖-(贪心排序+01背包)
2020蓝桥杯国赛B组-搬砖-(贪心排序+01背包)
2022-06-30 15:44:00 【可爱美少女】
题意:
就是给你n个砖头,每个砖头有个重量和价值,现在让你把一些砖块垒起来,对于每个砖块,他上面的所有砖块的重量不能超过他本身的价值。问你这个垒起来的砖块价值总和最大是多少。
思考:
比赛时感觉后面的也都不简单,实际上多思考思考就好了。首先想到的就是dp,但是对于每个砖块怎么保证,他上面的重量总和小于等于他的价值呢,这个该怎么维护呢。实际上在纸上画一画,思考一下可以先处理上面的砖块,再处理下面的砖块,一点一点的处理,因为你如果先处理下面的砖块,你怎么选对吧,才能保证下面的都满足。所以先考虑上面的,从上往下每个砖块都能线性处理。定义dp[i][j]是用了前i个砖块,此时重量为j的时候的最大价值。但是这样该怎么枚举砖块的顺序呢?实际上这就是要排序,以前就做过这种,比如国王的游戏。这题可以让i在上面,j在下面,我们让wi+sum<vj,wj+sum>vi,也就是让i在上面的时候j可以选,让i在下面的时候,j不可以选了。所以转化一下这个公式,可以把sum丢掉,sum是上面所有的重量。然后公式就是wi<vj,vi<wj。两个想加可以得到wi+vi<wj+vj。所以按这个排序就行。然后对于维护每个砖块上面的重量小于他的价值,其实在dp的时候加个判断条件就够了。然后其实就是01背包,加了一个贪心排序,和多了一个判断条件。可以优化为1维的。
代码:
二维版本:
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define db double
#define int long long
#define PII pair<int,int >
#define mem(a,b) memset(a,b,sizeof(a))
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int mod = 1e9+7,inf = 1e18;
const int N = 1e5+10,M = 2010;
int T,n,m,k;
PII va[N];
int dp[1005][20005];
bool cmp(PII A,PII B)
{
return A.fi+A.se<B.fi+B.se;
}
signed main()
{
IOS;
cin>>n;
for(int i=1;i<=n;i++) cin>>va[i].fi>>va[i].se;
sort(va+1,va+1+n,cmp);
m = n*20; //重量最多是这些
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
dp[i][j] = max(dp[i][j],dp[i-1][j]); //如果这个砖块不选
if(va[i].se>=j-va[i].fi&&j>=va[i].fi) dp[i][j] = max(dp[i][j],dp[i-1][j-va[i].fi]+va[i].se); //如果选,要保证价值大于上面的总重量。
}
}
int maxn = 0;
for(int j=0;j<=m;j++) maxn = max(maxn,dp[n][j]);
cout<<maxn;
return 0;
}
一维版本:
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define db double
#define int long long
#define PII pair<int,int >
#define mem(a,b) memset(a,b,sizeof(a))
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int mod = 1e9+7,inf = 1e18;
const int N = 1e5+10,M = 2010;
int T,n,m,k;
PII va[N];
int dp[20005];
bool cmp(PII A,PII B)
{
return A.fi+A.se<B.fi+B.se;
}
signed main()
{
IOS;
cin>>n;
for(int i=1;i<=n;i++) cin>>va[i].fi>>va[i].se;
sort(va+1,va+1+n,cmp);
m = n*20;
for(int i=1;i<=n;i++)
{
for(int j=m;j>=0;j--)
{
if(va[i].se>=j-va[i].fi&&j>=va[i].fi)
dp[j] = max(dp[j],dp[j-va[i].fi]+va[i].se);
}
}
int maxn = 0;
for(int j=0;j<=m;j++) maxn = max(maxn,dp[j]);
cout<<maxn;
return 0;
}
总结:
多多思考呀,其实都不难,这就是以前在upc做过的原题可以说。
边栏推荐
- 抖快B为啥做不好综艺
- 微信表情符号写入判决书,你发的OK、炸弹都可能成为“呈堂证供”
- Interview experience of service end test engineer
- ArcMap operation series: 80 plane to latitude and longitude 84
- What are the reasons for the errors reported by the Flink SQL CDC synchronization sqlserver
- MC Instruction Decoder
- '&lt;', hexadecimal value 0x3C, is an invalid 问题解决
- LeCun指明下一代AI方向:自主机器智能
- 【算法篇】四种链表总结完毕,顺手刷了两道面试题
- Bidding announcement: Taizhou Unicom Oracle all in one machine and database maintenance service project in 2022
猜你喜欢

【活动报名】探秘元宇宙,就差你了!7月2号我在深圳现场等你!

Google play index table

构建适合组织的云原生可观测性能力

There are so many kinds of coupons. First distinguish them clearly and then collect the wool!

猎头5万挖我去VC

牛客网:乘积为正数的最长连续子数组

Cesium-1.72 learning (earth model creation online offline tile)

halcon知识:区域专题【07】

MySQL transaction / lock / log summary

go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
随机推荐
招标公告:2022年台州联通Oracle一体机和数据库维保服务项目
今晚19:00知识赋能第2期直播丨OpenHarmony智能家居项目之控制面板界面设计
Swagger's asp Net core web API help page
招标公告:深圳市财政局数据库异地灾备项目
【Verilog基础】十进制负数的八进制、十六进制表示
GaussDB创新特性解读:Partial Result Cache,通过缓存中间结果对算子进行加速
MC Instruction Decoder
halcon变量窗口的图像变量不显示,重启软件和电脑都没用
互联网研发效能之去哪儿网(Qunar)核心领域DevOps落地实践
云技能提升好伙伴,亚马逊云师兄今天正式营业
详解Go语言中for循环,break和continue的使用
Log4j2 进阶使用
Open source STM32 USB-CAN project
什么是XR扩展现实,XR云串流平台有哪些
Arcmap操作系列:80平面转经纬度84
分布式机器学习:模型平均MA与弹性平均EASGD(PySpark)
附加:(还没写,别看~~~)WebMvcConfigurer接口;
云和恩墨中标天津滨海农村商业银行2022-2023年度Oracle维保项目
边缘计算平台如何助力物联网发展
How to get the preferential activities for stock account opening? Is online account opening safe?