ACM竞赛学习整理开篇之01背包问题。

最近,偶然的一次机会让我关注信息奥赛的一些内容。发现其中的内容很有趣,是学习编程的一条很好的路径,又能很好地将数学和编程联系到一起。在csdn里看到了不少同好也在学习ACM竞赛。于是,决定通过csdn这个平台来记录,我的ACM学习之路。

背包问题:

背包问题已经研究了一个多世纪,早期的作品可追溯到1897年 [1] 数学家托比亚斯·丹齐格(Tobias Dantzig,1884-1956)的早期作品 [2] ,并指的是包装你最有价值或有用的物品而不会超载你的行李的常见问题。

背包问题的应用:

1998年的石溪布鲁克大学算法库的研究表明,在75个算法问题中,背包问题是第18个最受欢迎,第4个最需要解决的问题(前三为后kd树,后缀树和bin包装问题)。
背包问题出现在各种领域的现实世界的决策过程中,例如寻找最少浪费的方式来削减原材料, [4] 选择投资和投资组合, [5] 选择资产支持资产证券化 [6] ,和生成密钥为Merkle-Hellman [7] 和其他背包密码系统。

在ACM竞赛中设计的背包问题有:

先了解下3种简单的背包概念:

0-1背包 (ZeroOnePack): 有N件物品和一个容量为V的背包。每种物品均只有一件 第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
完全背包(CompletePack): 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
多重背包 (MultiplePack): 有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用, 每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。*

比较三个题概念,会发现不同点在于每种背包的数量,01背包是每种只有一件,完全背包是每种无限件,而多重背包是每种有限件。

**

01 背包

1、OJ 例题
【例题】
有n个物品,编号为i的物品的重量为w[i],价值为c[i],现在要从这些物品中选一些物品装到一个容量为m的背包中,使得背包内物体在总重量不超过m的前提下价值尽量大。
【输入】
第1行:两个整数,n(物品数量,n≤3500)和m(背包容量,m≤12880)。
第2…n+1行::每行二个整数w[i],c[i],表示每个物品的重量和价值。
【输出】
仅一行,一个数,表示最大总价值。
【输入样例】
4 6
1 4
2 6
3 12
2 7
【输出样例】
23

2、 解题思路:

用动态规划的思路,阶段就是“物品的件数”,状态就是“背包剩下的容量”,那么很显然f [ i , v ] 就设为从前 i 件物品中选择放入容量为 v 的背包最大的价值。那么状态转移方程为:

 f[i][v]=max{ f[i-1][v],f[i-1][v-w[i]]+val[i] }。

把这个过程理解下:在前i件物品放进容量v的背包时,

它有两种情况:

第一种是第i件不放进去,这时所得价值为:f[i-1][v]

第二种是第i件放进去,这时所得价值为:f[i-1][v-w[i]]+val[i]

(第二种是什么意思?就是如果第i件放进去,那么在容量v-w[i]里就要放进前i-1件物品)

最后比较第一种与第二种所得价值的大小,哪种相对大,f[i][v]的值就是哪种。

(这是基础,要理解!)

3、 代码求解:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 1001
#define MOD 2520
#define E 1e-12
using namespace std;
int m,n;
int w[N],c[N],f[N];void ZeroOnePack(int cost,int weight)
{for(int v=m;v>=weight;v--){f[v]=max(f[v],f[v-weight]+cost);cout<<"f["<<v<<"]"<<"="<<f[v]<<"    ";}cout<<endl;
}int main()
{cin>>m>>n;for(int i=1;i<=n;i++)cin>>w[i]>>c[i];cout<<endl;for(int i=1;i<=n;i++)ZeroOnePack(c[i],w[i]);cout<<"max="<<f[m]<<endl;return 0;
}

4、结果输出


5、反思总结

背包问题是贪心算法的实例,可以根据动态规划解题步骤来实现

(问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成)找出01背包问题的最优解以及解组成,然后编写代码实现。

回顾01背包的定义:

PS:学习的心得比较难写,我将代码放到了C-free开发环境中试验了下,然后把计算的结果打印在了屏幕上,然后草稿纸上将其步骤再简单画了画,最后在网上查找了相关的内容来帮助理解,以上内容,基本上还是复制粘贴,等后续实际问题再操练吧。
这里有杭电OJ上的一道例题供大家参考:

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2602

代码:http://www.wutianqi.com/?p=533

参考文档:

1、https://blog.csdn.net/weixin_41162823/article/details/87878853背包问题-笔记整理

2、https://blog.csdn.net/qq_37767455/article/details/9908667801背包问题 图解+详细解析

3、http://www.wutianqi.com/blog/539.html背包之01背包、完全背包、多重背包详解

4、https://blog.csdn.net/chanmufeng/article/details/82955730彻底理解0-1背包问题

ACM竞赛学习整理开篇之01背包问题相关推荐

  1. ACM竞赛学习整理--矩阵运算

    ACM竞赛学习整理–矩阵运算 了解矩阵类 [任务] 实现矩阵的基本变换 [接口] 结构体:Matrix 成员变量: int n,m 矩阵大小 int a[][] 矩阵内容 重载运算符: +.-.x 成 ...

  2. ACM竞赛学习整理--模拟算法举例POJ1068

    什么是模拟 仅仅使用较简单的算法和数据结构的题目. 模拟顾名思义,就是按照题目的要求,一步步写出代码. 常见的模拟方法 a.用数学量和图形描述问题 计算机处理的是数学量.若要用计算机解决实际问题,需要 ...

  3. ACM竞赛学习整理--Gauss求解POJ1166

    这道题目和1830比较类似,1830是求解的个数,这道题目相当于求线性方程组的整数解. 题目主要内容:有9个钟,其中9个操作方法来扳动上面的指针,每个操作每次只能把指针移动90度,且每个操作是对一组钟 ...

  4. ACM竞赛学习指南(算法工程师成长计划)

    算法工程师成长计划 近年来,算法行业异常火爆,算法工程师年薪一般20万-100 万.越来越多的人学习算法,甚至很多非专业的人也参加培训或者自学,想转到算法行业.尽管如此,算法工程师仍然面临100万的人 ...

  5. NOIP竞赛学习整理--动态规划算法举例P1264

    动态规划 什么是动态规划? 动态规划是解决多阶段决策最优化问题的一种思想方法.所谓"动态",指的是在问题的多阶段决策中,按某一顺序,根据每一步所选决策的不同,将随即引起状态的转移, ...

  6. ACM竞赛学习记录------迷宫寻宝(BFS广度优先搜索)

    题目 洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入口.一些墙壁以及一个宝藏.由于迷宫是四连通的,即在迷宫中的一个位置,只能走到与它直接相邻的其他四个位置(上.下.左.右) ...

  7. 九种 0-1 背包问题详解

    目录 动态规划概念 问题1:0-1背包问题 问题2:完全背包问题 问题3:多重背包问题 问题4:混合背包问题 问题5:二维背包问题 问题6:分组背包问题 问题7:有依赖的背包问题 (困难) 问题8:背 ...

  8. 动态规划——0-1背包问题

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 0-1背包问题 背包能够承受的总重量一定w,每个物品的总量不同int[] weight表示.怎么放才 ...

  9. ACM如何入门,ACM竞赛需要学习哪些算法?

    #################成绩################## 大一:2017年4月份"玲珑杯"河南工业大学2017年ACM程序设计大赛暨河南高校邀请赛,获得银奖 20 ...

最新文章

  1. julia有 pytorch包吗_有了Julia语言,深度学习框架从此不需要计算图
  2. Matlab编程与数据类型 -- 开关语句switch/end
  3. Windows下有关NDK的安装资料
  4. java中float和double型数据在赋值时有哪些注意事项?,java语言中float和double类型的数据在编程时的注意事项...
  5. 30天敏捷结果(2):用三个故事驱动你的一周
  6. git连接jenkins_开普勒云平台:如何配置gitlab与Jenkins
  7. mongodb备份每一天的数据
  8. 安卓安装之离线搭建Android Studio开发环境
  9. 浅析HandlerThread
  10. 第一次JAVA课,第一次课堂考,课后感受
  11. 使用spring的aop监听所有controller或者action日志
  12. 计算机财务模型管理实验内容,计算机财务管理实验报告详细分解.doc
  13. 情侣的网站代码java_GitHub - ByronCui/lovers-website: 程序员的情侣网站 (programmer's website of lovers)...
  14. 【附源码】Java计算机毕业设计家政管理系统(程序+LW+部署)
  15. redis的高级教程
  16. CodeTop097 乘积最大子数组
  17. python告诉你迪丽热巴 vs 杨幂 vs 林志玲谁最美
  18. UE4 直接打包图片到目录中,不打包成pak
  19. python 词云图 WordCloud
  20. 机器人总动员英语情歌_机器人总动员经典台词对白爱情电影英文独白

热门文章

  1. mqtt android封装,Android之MQTT封装使用
  2. KKT条件和拉格朗日乘子法
  3. 组会PPT20200910《大工HPT放电结果错误剖析》
  4. 嵌入式编程与c语言有何区别,有的嵌入式设备也提供C++编译器,那还有理由坚持使用C语言吗?...
  5. [原理篇] Soft Regression
  6. C++primer: 引用与 const 引用
  7. Xml文件数据的优点
  8. 删除结果集中字段重复的方法
  9. 通过崩溃地址找错误行数之Delphi版
  10. 一键打开vs中的网站