题目描述

新学期伊始,适逢顿顿书城有购书满 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。

输出格式

输出到标准输出。

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

这道题,我刚开始是使用DFS暴力递归来枚举所有可能的情况,不出我所料,只得了70分;以下是我得分70的代码:

# include <iostream>
# include <algorithm>
# include <vector>
# define maxn 300010
using namespace std;
int n, x;
int minx = maxn;
vector<int>book;
int visit[35] = { 0 };
void DFS(int sum, int t)
{if (sum >= x) {minx = min(minx, sum);return;}for (int i = t; i < book.size(); i++) {if (visit[i] == 0) {visit[i] = 1;DFS(sum + book[i], i);visit[i] = 0;}}
}
int main()
{cin >> n >> x;int y;for (int i = 0; i < n; i++) {cin >> y;book.push_back(y);}DFS(0,0);cout << minx << endl;return 0;
}

之后,我开始思考更好的解决方案。既然不能通过枚举所有的情况来找到答案 ,那肯定是有一种途径来找到最优解,所以自然的联想到了dp(动态规划);我们再来看一下这个问题,寻找超过包邮条件x的最小数字组合。可以转化为先求书的总价sum,再用sum减去x得y,问题就变成了寻找不超过y(达到包邮条件)的最大数字组合,再用总价减去这个数字组合,即可得到最终答案。寻找不超过y的最大数字组合,这种类型就是典型的背包问题。这里,我们来简单回顾一下背包问题的几个核心思想:

子问题:当前背包容量j,前i个物品最佳组合对应的价值
递推关系式:v[i]:各商品价值   w[i]:各商品重量

j<w[i]: f[i][j]=f[i-1][j]
j>w[i]: f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i])

以样例1为例:

4 100
20
90
60
60
i/j 0 ``` 20 ``` 60 ``` 90 ``` 130
0 0 ``` 0 ``` 0 ``` 0 ``` 0
1(20) 0 ``` 20 ``` 20 ``` 20 ``` 20
2(90) 0 ``` 20 ``` 20 ``` 90 ``` 110
3(60) 0 ``` 20 ``` 60 ``` 90 ``` 110
4(60) 0 ``` 20 ``` 60 ``` 90 ``` 120

其中,130就是用书的总价230减去达到包邮条件所需的100得到的,然后我们要寻找不超过130的最大数字组合,类比一下背包问题,130就相当于背包的容量。

以下是得分100的代码:

# include <iostream>
# include <algorithm>
# define maxn 300010
using namespace std;
int n, x;
int v[40] = { 0 };
int f[40][maxn] = { {0} };
int main()
{cin >> n >> x;int sum = 0;for (int i = 1; i <= n; i++) {cin >> v[i];sum += v[i];}int y = sum - x;for (int i = 1; i <= n; i++) {  for (int j = 1; j <= y; j++) {f[i][j] = f[i - 1][j];//背包问题的核心公式if (j >= v[i]) {f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + v[i]);//背包问题的核心公式}}}int r = sum - f[n][y];cout << r << endl;return 0;
}

以上是我的个人见解,欢迎大家观看指正。

CSP-何以包邮?(从背包问题的角度出发)相关推荐

  1. ccf csp何以包邮?背包问题思路

    背包问题 问题描述 一个旅行者有一个最多能用M公斤的背包,现在有N件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为V1, V2,..., Vn. 若每种物品只有一件求旅行者能获得最大 ...

  2. csp-202209-2何以包邮?——背包问题

    根据题意原问题属于01背包问题,但是标准的01背包求的是最大价值,而此题是一个最小值问题,min(ans)>x       max(ans')<∑Vi -x (ans'=∑vi-ans) ...

  3. 2022年9月CSP认证题解 如此编码(k进制),何以包邮?(背包问题),吉祥物投票(珂朵莉树、懒标记、并查集)

    T1 如此编码 思路 由公式 和前缀乘积定义 得m=b1+a1×b2+⋅⋅⋅+a1×a2×⋅⋅⋅×an−1×bnm=b_1+a_1\times b_2+···+a_1\times a_2\times· ...

  4. 何以包邮?(动态规划:0-1背包问题)

    题目描述: 新学期伊始,适逢顿顿书城有购书满  x 元包邮的活动,小 P 同学欣然前往准备买些参考书. 一番浏览后,小 P 初步筛选出 n 本书加入购物车中,其中第 i 本(1≤ i ≤ n)的价格为 ...

  5. 【寒假每日一题】AcWing 4700. 何以包邮?

    目录 一.题目 1.原题链接 2.题目描述 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.知识风暴 0-1背包问题 一.题目 1.原题链接 4700. 何以包邮? - AcWing题库 ...

  6. 4700. 何以包邮?

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

  7. 网络营销外包专员浅析从用户角度出发如何完善网络营销外包?

    随着网络优化技术的不断优化,百度算法也在跟随时代脚步下用户的变化而变化,为什么要跟随用户需求而变化?众所周知,在企业网站建设.优化.推广运营等方面全部都是以用户真实需求为基础而进行的,搜索引擎也要根据 ...

  8. 网站推广——网站推广专员从蜘蛛角度出发如何进行网站优化

    相信每个站长在优化网站期间都会设身处地的为网站进行全面的优化运营,尤其是要从用户的角度出发,只有全心全意的为用户解决需求才能真正的受到用户和搜索引擎的关注和喜爱.那么如果我们从蜘蛛抓取的角度出发在优化 ...

  9. 通道注意力新突破!从频域角度出发,浙大提出FcaNet:仅需修改一行代码,简洁又高效

    该文是浙江大学提出一种的新颖的通道注意力机制,它将通道注意力机制与DCT进行了巧妙的结合,并在常规的通道注意力机制上进行了扩展得到了本文所提出的多谱通道注意力机制:FcaLayer.作者在图像分类.目 ...

最新文章

  1. 建一所希望小学需要600万!
  2. MyBatis Generator 学习
  3. ustc小道消息20211227
  4. MySQL(六)InnoDB锁详解
  5. 2019-nCoV 全国新型肺炎疫情每日动态趋势可视图
  6. 说说说vue.js中的组
  7. 关于python的垃圾回收机制_Python的垃圾回收机制
  8. 同步工具之CyclicBarrier循环栅栏
  9. 私域经济运营能力最关键的三个指标
  10. Python3入门机器学习经典算法与应用 第3章 numpy矩阵运算
  11. 游戏辅助制作技术分析
  12. 苏州回收AB模块罗克韦尔、昆山回收AB触摸屏那些事
  13. 将CD转MP3工具(WIN7以上可以使用)
  14. 谁再说“游戏没用”,就拿这个回怼他!
  15. 计算机教师的应用计划书,教师信息技术个人提升计划
  16. 如何在Mac上给移动硬盘加密
  17. leetcode每日一题--雀巢原理;抽屉算法;Quorum机制;分布式应用
  18. 5G和MEC在工业互联网中的应用探讨
  19. 五子棋游戏源码和核心算法的讲解(简易五子棋web版)
  20. 自定义根证书颁发机构 CA 生成自签名证书

热门文章

  1. Say Forever
  2. 大数据hive篇--hive报错return 2 return 3 解决方式
  3. 百度首页关于小米的新闻? 百度百家会不会成为百度败家
  4. miku好图(库存)
  5. canvas图片旋转,图片base64编码,保存图片
  6. 怎样安装 手机撑控汽车一键启动无钥匙进入系统?
  7. C8051F396 Flash操作
  8. JAVA Pattern.matches的使用
  9. FFmpeg 从零开始开发简单的音视频播放器(一)
  10. Microsoft Power Platform MDA app添加自定义按钮