商店

Problem Description

在商店里有N个物品,每个物品有原价和折扣价小美相要购买商品。小美拥有X元,一共Y张折扣券。小美需要最大化购买商品的数量,并在所购商品数量尽量多的前提下,尽量减少花费。 你的任务是帮助小美求出最优情况下的商品购买数量和花费的钱数。

input

第一行三个整数,以空格分开,分别表示N,X,Y。接下来N行,每行两个整数,以空格分开,表示一个的原价和折扣价。1≤N≤100,1≤X≤5000,1≤Y≤50,每个商品原价和折扣价均介于[1,50]之间。

ouput

一行,两个整数,以空格分开。第一个数字表示最多买几个商品,第二个数字表示在满足商品尽量多的前提下所花费的最少的钱数。

Sample Input 1

3 5 1
4 3
3 1
6 5

Sample Output 1

2 5

Sample Input 2

3 5 1
4 3
3 1
6 1

Sample Output 2

2 4

Sample Input 3

10 30 3
2 1
3 2
2 1
10 8
6 5
4 3
2 1
10 9
5 4
4 2

Sample Output 3

8 24

题目类型、难度、来源

  • 类型:动态规划
  • 难度:困难
  • 来源:美团校招-2023.3.18.10点-第四题-商店

总体思路:

  • 此题的难点在于有不确定数量的折扣卷。如果折扣卷无限或没有折扣卷,那么这题就可以使用贪心来做。
  • 此题应该用动态规划,使用** d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k]表示前i个商品,花费了j元,用掉了k张折扣卷能买到的商品数量**。使用price[i]表示第i个商品的价格,lowprice[i]表示第i个商品的折扣价。
    • i从1开始,前i=0个表示个表示没有商品,因此边界条件就确定了,即 d p [ 0 ] [ 0 ] [ 0 ] = 0 dp[0][0][0]=0 dp[0][0][0]=0。使用-1表示状态该状态非法。
    • 状态转移:在考虑第i个商品时,只有三种情况:
      • 不买第i个商品。此时很显然用掉的钱及用掉的折扣卷数量和前i-1个商品的情况一样,即 d p [ i ] [ j ] [ k ] = d [ i − 1 ] [ j ] [ k ] dp[i][j][k] = d[i-1][j][k] dp[i][j][k]=d[i−1][j][k]
      • 原价购买第i个商品。此时有 d p [ i ] [ j ] [ k ] = d p [ i − 1 ] [ j − p r i c e [ i ] ] [ k ] + 1 dp[i][j][k] = dp[i-1][j-price[i]][k]+1 dp[i][j][k]=dp[i−1][j−price[i]][k]+1
      • 在有折扣卷的情况下,使用折扣卷购买第i个商品。此时有 d p [ i ] [ j ] [ k ] = d p [ i − 1 ] [ j − l o w p r i c e [ i ] ] [ k − 1 ] + 1 dp[i][j][k] = dp[i-1][j-lowprice[i]][k-1]+1 dp[i][j][k]=dp[i−1][j−lowprice[i]][k−1]+1
    • 因为题目要求最多买多少商品,因此状态转移方程为: d p [ i ] [ j ] [ k ] = m a x ( d [ i − 1 ] [ j ] [ k ] , d p [ i − 1 ] [ j − p r i c e [ i ] ] [ k ] + 1 , d p [ i − 1 ] [ j − l o w p r i c e [ i ] ] [ k − 1 ] + 1 ) dp[i][j][k]=max(d[i-1][j][k], dp[i-1][j-price[i]][k]+1, dp[i-1][j-lowprice[i]][k-1]+1) dp[i][j][k]=max(d[i−1][j][k],dp[i−1][j−price[i]][k]+1,dp[i−1][j−lowprice[i]][k−1]+1)
  • 因为状态转移方程过于复杂,很难找到一个更新dp数组的顺序。因此需要反过来思考。即使用 d p [ i ] [ j ] [ k ] dp[i][j][k] dp[i][j][k]去更新 d [ i + 1 ] [ j ] [ k ] d[i+1][j][k] d[i+1][j][k]、 d p [ i + 1 ] [ j + p r i c e [ i + 1 ] ] [ k ] dp[i+1][j+price[i+1]][k] dp[i+1][j+price[i+1]][k]、 d p [ i + 1 ] [ j + l o w p r i c e [ i + 1 ] ] [ k + 1 ] dp[i+1][j+lowprice[i+1]][k+1] dp[i+1][j+lowprice[i+1]][k+1]

AC代码

#include <iostream>
#include <algorithm>
using namespace std;
int main(){int N, X, Y;cin >> N >> X >> Y;// 原价 int *price = new int[N+5];//折扣价 int *low_price = new int[N+5];for (int i = 0; i < N; i++){cin >> price[i] >> low_price[i];}// 初始化dp数组 int dp[N+5][X+10][Y+10] = {0};for (int i = 0; i <= N; i++){for (int j = 0; j <= X; j++){for (int k = 0; k <= Y; k++){dp[i][j][k] = -1;}}}// 前i=0个商品表示没有商品,因此dp[0][0][0]只能为0 dp[0][0][0] = 0;for (int i = 0; i < N; i++){for (int j = 0; j <= X; j++){for (int k = 0; k <= Y; k++){if (dp[i][j][k] == -1) continue;dp[i+1][j][k] = max(dp[i][j][k], dp[i+1][j][k]);if (j+price[i] <= X){dp[i+1][j+price[i]][k] = max(dp[i][j][k]+1, dp[i+1][j+price[i]][k]);}if (j+low_price[i] <= X && k+1 <= Y){dp[i+1][j+low_price[i]][k+1] = max(dp[i][j][k]+1, dp[i+1][j+low_price[i]][k+1]);}}}}int max_sum = -1, min_cost = 1000000000;for (int i = 1; i <= N; i++){for (int j = 0; j <= X; j++){for (int k = 0; k <= Y; k++){  if (dp[i][j][k] > max_sum){max_sum = dp[i][j][k];min_cost = j;}else if (dp[i][j][k] == max_sum){if (j < min_cost){min_cost = j;}}}}} cout << max_sum << " " << min_cost;return 0;
}
  • 更多大厂真题可以看:2023实习、秋招互联网大厂技术岗算法真题-刷题(持续更新)

美团校招-2023.3.18.10点-第四题-商店-困难相关推荐

  1. 美团校招-2023.3.18.10点-第一题-小美抓敌人-简单

    小美抓敌人 Problem Description 小美在玩一项游戏.该游戏的目标是尽可能抓获敌人. 敌人的位置将被一个二维坐标(x,y)所描述. 小美有一个全屏技能,该技能能一次性将若干敌人一次性捕 ...

  2. 美团笔试题2021.8.29(第四题求大佬解答)

    美团笔试题2021.8.29 又再帮同学写,推了这周的周赛,侥幸都有点思路 丁香树 题目描述 思路 因为芳香值最大为30,所以用一个数组存储已走过的芳香值,然后走到第i个点,找比当前芳香值小的有多少个 ...

  3. 美团校招php笔试题,【美团点评】2020校招数据分析方向笔试题

    这几天做了下美团校招的一些套题.(只写了编程,这两天慢慢更新吧) 这套题还是蛮简单的..我暴力了好几个都能过.一个小时多一点差不多能写完. 4.棋子翻转 题意:在4*4的棋盘上摆满了黑白棋子,黑白两色 ...

  4. 创造联结 | SocialBeta 2023 数字营销 10 大趋势

    2023 年,有人乐观,有人忐忑,但更普遍的社会情绪是--期待. 这一年,终归是个不一样的年头.加速变化的大环境下,过去一段时间内,品牌大多谈生存.讲务实的基调发生了微妙的变化,今年更为高频出现的词是 ...

  5. linux登录界面主题,Ubuntu 18.10(Cosmic Cuttlefish) 新登录界面亮相,主题为Yaru

    Ubuntu 18.10(Cosmic Cuttlefish)是流行的基于Linux的操作系统的下一个主要版本,目前正在开发中,承诺新功能和增强功能. 即将于今年秋季于2018年10月18日发布的即将 ...

  6. ubuntu 18.10无法locate boot-repair

    系统: ubuntu 18.10 发行版本号:cosmic 问题表现为如下: ubuntu 18.10+win7双系统只能进入ubuntu且没有引导 ubuntu 18.10添加ppa并且update ...

  7. linux18.2安装界面,Ubuntu 18.10下安装Grub Customizer 5.1.0配置grub2图形化界面

    配置Grub2/burg引导装载程序Grub Customizer 5.1.0新增加对Ubuntu 18.10的支持,我们可以用PPA源来安装,同时还支持Ubuntu 18.04.16.04.14.0 ...

  8. Lubuntu 18.10仍有可能支持32位PC

    2019独角兽企业重金招聘Python工程师标准>>> 导读 在今年早些时候推出下一个Lubuntu版本18.10的开发之后,Lubuntu开发人员Simon Quigley宣布,轻 ...

  9. 【美团校招笔试题】去除字符串首尾空格,中间多个空格只保留一个

    要求: 这是本人参加美团校招在线考试笔试题,如果此行为违反了美团校招笔试题商业保密性,请与本人联系. 思路:用一个while循环扫描整个字符串,用pStart字符指针指向整个字符串首地址,如果遇到首部 ...

最新文章

  1. 极光推送后台php接口,极光推送Jpush(v2)接口 服务端PHP版本的REST API推送类
  2. 使用Struts2防止表单重复提交
  3. 浏览器是如何工作的?(转载)
  4. 前后端分离WebStorm自动部署到tomcat服务器
  5. 无法将成员变量添加到ID为 的控件中
  6. python fromhex_Python hexstring-list-str之间的转换方法
  7. 费诺编码的gui页面设计_GUI设计和UI设计有什么区别?
  8. C#中对XML文件的一些基本操作[转载]
  9. [渝粤教育] 西南科技大学 语言学概论(汉语言文学) 在线考试复习资料
  10. 使用 nginx 的 stream模块的TCP 转发实现内网SSH
  11. sql语句中用select语句查询值大于平均值的情况
  12. android7.1 repo,RK3399 Android 7.1 删除repo后编译报错
  13. 中国象棋,源码,开发,毕业设计,go,qt,c++,gin,游戏,残局,悔棋,人机,网络对战,双人
  14. 6.泛型方法:什么是泛型方法???
  15. 简约至上设计书读后感
  16. 域名防红直连防封怎么布置?
  17. git pull 失败:Failed to connect to 127.0.0.1 port 10080: Connection refused
  18. 线上科技展厅vr全景展厅设计 广交会布展
  19. Python批量修改文件后缀
  20. ACM模板 | 学习笔记 数学相关

热门文章

  1. GM7123 (RGB转VGA)
  2. echarts社区(多样化echarts图表)
  3. 专科生要怎么做才能进入阿里巴巴、百度、腾讯这样的公司?
  4. 无线网络中PPK-MIC和CKIP-CMIC的学习资料
  5. win10文件夹加密_分享win10系统不使用第三方工具加密文件夹的操作方法(图文)
  6. 另一棵树的子树(你一定要会的基础面试题)
  7. 常见网络摄像机默认使用的端口,RTSP地址
  8. PDI(kettle) 阻塞数据直到步骤都完成、Blocking step组件用法及区别
  9. Firefox/Chrome下flash的wmode参数设为opaque或transparent时输入文本框中无法输入中文汉字的解决方法...
  10. POS终端“密事”之PIN加解密