目录

一、题目

1、原题链接

2、题目描述

二、解题报告

1、思路分析

2、时间复杂度

3、代码详解

三、知识风暴

0-1背包问题


一、题目

1、原题链接

4700. 何以包邮? - AcWing题库

2、题目描述

新学期伊始,适逢顿顿书城有购书满 x 元包邮的活动,小 P 同学欣然前往准备买些参考书。

一番浏览后,小 P 初步筛选出 n 本书加入购物车中,其中第 i本(1≤i≤n)的价格为 ai元。

考虑到预算有限,在最终付款前小 P 决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 m 在满足包邮条件(m≥x)的前提下最小。

试帮助小 P 计算,最终选购哪些书可以在凑够 x 元包邮的前提下花费最小?

输入格式

输入的第一行包含空格分隔的两个正整数 n 和 x,分别表示购物车中图书数量和包邮条件。

接下来输入 n 行,其中第 i 行(1≤i≤n)仅包含一个正整数 ai,表示购物车中第 i 本书的价格。

输入数据保证 n 本书的价格总和不小于 x。

输出格式

仅输出一个正整数,表示在满足包邮条件下的最小花费。

数据范围

70% 的测试数据满足:n≤15;
全部的测试数据满足:n≤30,每本书的价格 ai≤10^4 且 x≤a1+a2+⋯+an。

输入样例1:

4 100
20
90
60
60

输出样例1:

110

样例1解释

购买前两本书 (20+90) 即可包邮且花费最小。

输入样例2:

3 30
15
40
30

输出样例2:

30

样例2解释

仅购买第三本书恰好可以满足包邮条件。

输入样例3:

2 90
50
50

输出样例3:

100

样例3解释

必须全部购买才能包邮。

二、解题报告

思路来源:AcWing 4700. 何以包邮?(寒假每日一题2023) - AcWing

y总yyds

1、思路分析

暴力解法1(二进制搜索)

1)总共有n本书,每本书都有两种选择,删或者不删即0或1来代表,可以用长度为n位的二进制数来表示所有的情况数即2^n种情况。

2)所以可以枚举长度为n的每个二进制数,针对每个二进制数,依次判断第i位的情况,如果为1,则总和加上第i本书的价格,否则不操作,直到判断完第n位。

3)针对n种情况,选出其中满足条件的最小值输出,即为所求。

暴力解法2(dfs)

动规解法

1)该问题相当于从购物车中的书中去掉几本,而且去掉书的总价格要超过购物车中原来全部书的总价格(sum)减去x,即确保去掉书之后总价格还大于x,并且要求去掉书的价格在这个条件之下越大越好。

2)该问题就可以转化为一个背包问题,即从n件物品中选择几件来放入容量为sum-x的背包中,使背包价值越大越好,而针对本题,物品为书,而书的重量和价值均为书的价格,背包容量则为可以删掉的书的总价格。

3)按照0-1背包问题进行模拟即可,最终可以求得可删除的书的最大总价格,用购物车中原来全部书的总价格减去可删除书的最大总价格,得到的便是满足包邮条件的最小花费,输出结果,即为所求。

2、时间复杂度

暴力解法时间复杂度O(n2^n)

动规解法时间复杂度O(n^2)

3、代码详解

暴力代码1

#include <iostream>
#include <algorithm>
using namespace std;
int a[35];
int main()
{   int n,x;cin>>n>>x;for(int i=0;i<n;i++){cin>>a[i];}int res=1e8;for(int i=0;i<1<<n;i++){int sum=0;for(int j=0;j<n;j++){if(i>>j&1==1){sum+=a[j];}}if(sum>=x)res=min(res,sum);}cout<<res;return 0;
}

暴力代码2

#include <iostream>
#include <algorithm>
using namespace std;
int a[35];
int n,x;
int res=1e8;
void dfs(int u,int sum){if(u==n){if(sum>=x) res=min(res,sum);}else{dfs(u+1,sum);dfs(u+1,sum+a[u]);}
}
int main()
{   cin>>n>>x;for(int i=0;i<n;i++){cin>>a[i];}dfs(0,0);cout<<res;return 0;
}

动规代码

#include <iostream>
using namespace std;
int dp[300010];
int a[35];
int main()
{   int n,x;cin>>n>>x;int sum=0;for(int i=1;i<=n;i++){cin>>a[i];sum+=a[i];}for(int i=1;i<=n;i++){for(int j=sum-x;j>=a[i];j--){dp[j]=max(dp[j],dp[j-a[i]]+a[i]);}}cout<<sum-dp[sum-x];return 0;
}

三、知识风暴

0-1背包问题

可以参考我的下面这篇博客:

【AcWing】AcWing 2. 01背包问题_万里悲秋常作客,百年多病独登台.的博客-CSDN博客

【寒假每日一题】AcWing 4700. 何以包邮?相关推荐

  1. AcWing - 寒假每日一题2023(DAY 11——DAY 15)

    文章目录 一.AcWing 4656. 技能升级(困难) 1. 实现思路 2. 实现代码 二.AcWing 4454. 未初始化警告(简单) 1. 实现思路 2. 实现代码 三.AcWing 4509 ...

  2. AcWing寒假每日一题2058. 笨拙的手指

    AcWing寒假每日一题2058. 笨拙的手指 题目描述 奶牛贝茜正在学习如何在不同进制之间转换数字. 但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔. 每当贝茜将数字转换为一个新的进制并写下结果 ...

  3. 4700. 何以包邮?

    Powered by:NEFU AB-IN Link 文章目录 4700. 何以包邮? 题意 思路 代码 4700. 何以包邮? 题意 新学期伊始,适逢顿顿书城有购书满 x 元包邮的活动,小 P 同学 ...

  4. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.11日(2017省赛A第9题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家看博客目录:https://b ...

  5. 【寒假每日一题】剪绳子(个人练习)详细题解+推导证明(第六天)

    文章目录 前言 题目 详细题解 写法1 O(nlogn)O(nlogn)O(nlogn) 推导证明 举一反三 总结 前言 今天终于出核酸检测的结果,还好大家都没事,不然怕是要封城了!!! 今天还是寒假 ...

  6. 【寒假每日一题】分巧克力(个人练习)详细题解+推导证明(第八天)附带转载程序员壁纸

    文章目录 前言 题目 详细题解 写法1 O(nlogn)O(nlogn)O(nlogn) 推导证明 举一反三 总结 前言 话说今天开始准备搞一个秋招的GitHub,算是复习一遍了. 今天还是寒假每日一 ...

  7. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.20日(2018省赛A组第8题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家每天看博客蓝桥杯专栏: htt ...

  8. 【寒假每日一题】数字三角形(个人练习)详细题解+推导证明(第二天)

    文章目录 前言 题目 详细题解 写法1 O ( n 2 ) O(n^2) O(n2) 推导证明 写法2 O ( n 2 ) O(n^2) O(n2) 推导证明 举一反三 总结 前言 昨天真是人生中奇葩 ...

  9. 倪文迪陪你学蓝桥杯2021寒假每日一题:1.19日(2018省赛A组第7题)

    2021年寒假每日一题,2017~2019年的省赛真题. 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供. 后面的每日一题,每题发一个新博文,请大家每天看博客蓝桥杯专栏: htt ...

最新文章

  1. 洛谷 P 1387 最大正方形
  2. C语言 将字符串中数字字符全部删除
  3. python是什么学了有什么用处_学python有什么用途 就业方向有哪些
  4. MFC中动态数组CArray的使用
  5. R语言与数据的概括性度量
  6. Nuget发布Dll
  7. 终于有人把安卓程序员必学知识点全整理出来了,送大厂面经一份!
  8. Navicat15安装笔记
  9. Oracle exp/imp导出导入命令及数据库备份
  10. VMware安装linux系统镜像教程
  11. 流体力学专业常用网站集合
  12. 使用adb命令获取手机ip地址
  13. 软件的开发模型之瀑布型和快速原型
  14. 域名解析到服务器ip,域名解析到服务器ip上无法访问的原因汇总
  15. 解决XML转JSON串时报错:Exception in thread main java.lang.NoClassDefFoundError: nu/xom/Serializer
  16. 不拆微动,一招解决鼠标双击问题
  17. Unirech腾讯云代充-通过VNC 登录腾讯云国际版Windows云服务器实例教程
  18. JavaScript 美术馆(改进2)
  19. Android 个人中心页面前端代码
  20. Revi开发 - 构件过滤(FilteredElementCollector)

热门文章

  1. 格式化字符串替换2022/8/2am
  2. Equalization Loss理解-更新中
  3. 【兼容】微信内置浏览器兼容
  4. linux下安装redis 可视化工具,类似于 Redis Desktop Manager
  5. pip3升级报错:PermissionError: [Errno 13] Permission denied: '/usr/bin/pip' - '/tmp/pip-yndfk0h8-uninsta
  6. 自然语言处理(NLP)入门
  7. HBase RowKey的设计原则
  8. 【Axure RP9 制作轮播图】
  9. smokeping图表各值意义解释
  10. sklearn机器学习之【学习曲线】