组装电脑

Problem Description

小红准备买一些零件来组装电脑。已知电脑一共有n个零件,每个零件有若干个型号。小红现在知道了每个型号的对应价格 a i a_{i} ai​,以及性能 v i v_{i} vi​。小红需要每个零件选择一个型号,在总价格不超过x元的前提下,最终的总性能尽可能大。你能帮帮她吗?

input

第一行输入两个正整数n和x,代表电脑的零件数量以及小红最大的预算。 接下来的3∗n行,每三行用来描述一个零件的不同型号的价格和性能。
对于每个零件,第一行输入一个正数m,代表该零件有多少种型号。 1 ≤ n , m ≤ 40 , 1 ≤ a i , v i , x ≤ 1 0 9 1≤n,m≤40,1≤a_i ,v_i ,x≤10^9 1≤n,m≤40,1≤ai​,vi​,x≤109
保证所有m之和不超过40,即所有零件的型号数保证所有m之和不超过40,即所有零件的型号数量之和不超过40种。

ouput

如果无法完成组装,则直接输出-1。否则输出一个正整数,代表最终最大的性能。

Sample Input

2 4
2
1 2
3 5
3
3 2 3
5 6 7

Sample Output

11

题目类型、难度、来源

  • 类型:动态规划
  • 难度:中等
  • 来源:蚂蚁春招-2023.3.16-组装电脑

总体思路:

  • 使用动态规划。 d p [ i ] [ j ] dp[i][j] dp[i][j]表示买前i个零件,共花了j元(i从1算起,i=0表示没有零件)获得的最大性能。 c o s t [ i ] , p e r f [ i ] cost[i],perf[i] cost[i],perf[i]分别表示第i个零件的价格和性能。
  • 边界条件: d p [ 0 ] [ 0 ] = 0 dp[0][0] = 0 dp[0][0]=0,表示买前0个零件,共花了0元,性能是0。
  • 状态转移方程: d p [ i ] [ j ] = m a x { d p [ i − 1 ] [ j − c o s t [ 0 ] ] + p e r f [ 0 ] , d p [ i − 1 ] [ j − c o s t [ 1 ] ] + p e r f [ 1 ] , . . . } dp[i][j]=max{\{dp[i-1][j-cost[0]]+perf[0], dp[i-1][j-cost[1]]+perf[1], ...\}} dp[i][j]=max{dp[i−1][j−cost[0]]+perf[0],dp[i−1][j−cost[1]]+perf[1],...}
  • 这个方程比较难计算,我们可以反过来思考。
    • 可以使用 d p [ i ] [ j ] dp[i][j] dp[i][j]去更新 d p [ i + 1 ] [ j + c o s t [ 0 ] ] dp[i+1][j+cost[0]] dp[i+1][j+cost[0]]、 d p [ i + 1 ] [ j + c o s t [ 1 ] ] dp[i+1][j+cost[1]] dp[i+1][j+cost[1]]等等。
    • 具体的: d p [ i + 1 ] [ j + c o s t [ 0 ] ] = m a x ( d p [ i + 1 ] [ j + c o s t [ 0 ] ] , d p [ i ] [ j ] + p e r f [ 0 ] ) dp[i+1][j+cost[0]]=max(dp[i+1][j+cost[0]], dp[i][j]+perf[0]) dp[i+1][j+cost[0]]=max(dp[i+1][j+cost[0]],dp[i][j]+perf[0])
      • 这个公式需要不断被刷新,因为 d p [ i + 1 ] [ j + c o s t [ 0 ] ] dp[i+1][j+cost[0]] dp[i+1][j+cost[0]]的值和多个dp数组值有关。
  • 完成上述推理后,我们开始写代码,却发现x的只最大可以达到 1 0 9 10^9 109,如果使用传统方法做动态规划,这肯定就不行了,因为开不了那么大的数组。为了解决这个问题,我们可以使用map充当数组。

AC代码

#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main(){int n, x;cin >> n >> x;int **cost = new int*[n];int **perf = new int*[n];int *comp_nums = new int[n];for (int t = 0; t < n; t++){cin >> comp_nums[t];cost[t] = new int[comp_nums[t]];perf[t] = new int[comp_nums[t]];for (int i = 0; i < comp_nums[t]; i++){cin >> cost[t][i];}for (int i = 0; i < comp_nums[t]; i++){cin >> perf[t][i];}}map<long long, long long> dp[45];dp[0][0] = 0;long long max_perf = -1;for (long long t = 0; t < n; t++){for (auto iter = dp[t].begin(); iter != dp[t].end(); iter++){long long dp_cost = iter->first;long long dp_perf = iter->second;for (long long i = 0; i < comp_nums[t]; i++){if (dp_cost+cost[t][i] <= x){dp[t+1][dp_cost+cost[t][i]] = max(dp[t+1][dp_cost+cost[t][i]], dp_perf+perf[t][i]);if ((t+1 == n) && (dp[t+1][dp_cost+cost[t][i]] > max_perf)){max_perf = dp[t+1][dp_cost+cost[t][i]];}}}}}cout << max_perf;return 0;
}
  • 更多大厂真题可以看:2023实习、秋招互联网大厂技术岗算法真题-刷题(持续更新)

蚂蚁春招-2023.3.16-组装电脑-中等相关推荐

  1. 大厂真题|蚂蚁春招.04.04研发岗笔试模拟赛

    2023大厂真题提交网站(含题解) www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度.现已录 ...

  2. 大数据开发方向分享:春招获蚂蚁金服、拼多多、华为(终端)、远景能源、华泰证券等offer

    大数据开发方向分享:春招获蚂蚁金服.拼多多.华为(终端).远景能源.华泰证券等offe 一.背景 2020届985硕士,投的基本是上海岗位,非科班转行大数据开发方向和Java后端开发. 参加了2020 ...

  3. 极客日报:蚂蚁启动春招,技术人才需求超八成;微软动视暴雪收购案遭调查;Firefox 98 发布|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  4. 2023年的春招,java怎么搞??

    1.你准备好了? 今天是2023年1月29号,春招已经慢慢开始了... 前几天看到这个新出炉|2022秋招洞察&2023春招趋势解读,还是有点东西! 在下是双非二本22届毕业从事物流行业jav ...

  5. 2023年春招正式启动!

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 2023年春招正式开始!目前已经启动的公司有:vivo.中国一汽等. 距离2023年暑期实习招聘只有不到2个 ...

  6. 躬身入局,干货分享,2023年春招后端技术岗(Python)面试实战教程,Offer今始为君发

    早春二月,研发倍忙,杂花生树,群鸥竟飞.为什么?因为春季招聘,无论是应届生,还是职场老鸟,都在摩拳擦掌,秣马厉兵,准备在面试场上一较身手,既分高下,也决Offer,本次我们打响春招第一炮,躬身入局,让 ...

  7. 新增25%岗位!航旅纵横2023春招开启!

    新增25%岗位!航旅纵横2023春招开启! 0.我们是谁? 中航信移动科技有限公司是由国务院国资委管理的中国民航信息集团有限公司发起成立,由民航局空管局.中国东方航空集团.中国南方航空集团作为主要股东 ...

  8. 京东2023春招面试记录

    京东2023春招 1. 京东一面:2023-2-20 2. 京东二面:2023-2-22 3. 京东三面(HR面):2023-2-27 1. 京东一面:2023-2-20 1)项目介绍 2)Sprin ...

  9. 2022年春招,双非硕士吃透16个软件测试开发技术栈,成功上岸

    小编分享的这份秋招软件测试面试总结包含了软件测试基础.MySQL基础.Liunx.web测试.接口测试.App测试.管理工具.Python.selenium.性能测试.LordRunner .计算机网 ...

最新文章

  1. jQuery Mobile的学习时间bottonbutton的事件学习
  2. 5.3.2 TCP连接管理
  3. 爱因斯坦牛顿达尔文投胎中国后
  4. PostgreSQL的德哥教程
  5. SAP低代码开发(Low Code Development)解决方案的一些使用截图
  6. centos proftp_在CentOS上禁用ProFTP
  7. MyBatis_1 简介
  8. deepfakes怎么用_[mcj]deepfakesApp使用说明(1)
  9. Error:File read error (source insight 4.0错误)
  10. 湖南警察学院计算机科学与技术专业,湖南警察学院计算机科学与技术专业2015年在福建理科高考录取最低分数线...
  11. 小小的起步VMware vSphere之二
  12. 普通类创建获取session 方式_Springboot系列之RestApi中获取枚举类属性的几种方式...
  13. java 线程释放_如何手动释放一个java线程占用的资源
  14. 数据处理与分析|涵盖七大分析方法
  15. 盘点PC端超好用的文字转语音工具,赶紧收藏起来
  16. 大型服装集团BI决策系统的分析主题模块
  17. 整体大于部分_怦然心动 Flipped,有多少整体大于全部!
  18. redis expire命令
  19. 航测新旗舰|大疆M300+赛尔102S
  20. 随着攻击媒介的多样化,与赎金相关的 DDoS 攻击从死里复活

热门文章

  1. 服务器硬件知识普及篇之服务器主板
  2. 高通camera Tuning常见面试题
  3. C\C++之(++p)->x 与 ++p->x的区别小记
  4. 服务器被攻击方式及防御措施?
  5. 新手机第一次充电,怎么充电对电池好?
  6. JS完结:用JavaScript写个功能完善的电商轮播图
  7. 中国邮政湖北分公司校招 计算机类
  8. 【乐绘派】Audition专业音频后期制作教程 | 4-浮动面板
  9. 八种排序算法的时间复杂度复杂度
  10. win11 蓝牙耳机连接电脑显示其他设备解决办法