背包专辑(转)

news/2024/11/20 22:36:29/

(解题报告本人所写,博客内容转自zeroclock)

这短时间看了论文《背包九讲》,看到背包问题解法中的优美之处也看到背包问题在现实中的应用,总结出一句话:背包问题值得一看。

    背包问题可以概括为这样的模型:有若干种选择,每种选择有一定的代价和价值,做某些选择会得到特定的状态,问我们在约定的条件下怎么得到特定的状态?这里的状态可以是代价和或者价值和或者由其他这两者组合而来的状态。这类问题需要枚举每种状态,但是可以通过动态规划减少枚举的次数,提高效率,主要思想是每次都利用前面得到的状态进行转移得到当前的状态。这类问题很少能用贪心的,首先,贪心很难证明策略是否正确,其次贪心必定使得枚举量大量减少,会导致结果错误。

    个人认为背包九讲中的很多模型本质都是两种模型:01背包模型、完全背包模型。大家可以把这两种模型理解透彻,然后再看其他模型,这样必定事半功倍。

    看《背包九讲》的过程中开了一个专题,大概26道题目,主要是Hdu和Poj的题目,题目有难有易,这次的专辑主要讲解这些题目,还有一些Uva的简单背包问题也会加入到这个专辑中。本专辑都只列举基本思路,如果大家想看详细思路或者代码请去我博客中查找,大部分题目我都有写解题报告。


   一、01背包问题 (先枚举物品,再逆序枚举容量)

1、Hdu 2602 Bone Collector 非常常规的01背包问题,用一维和二维数组都可以做,一维快相当多。 解题报告
      2、Poj 3624 Charm Bracelet  赤裸裸的01背包问题。 解题报告
      3、Hdu 2546 饭卡 n种菜选若干种使剩下的钱最少,背包容量是开始时的钱,物品体积是菜的价格,状态转移时记录答案。 解题报告
      4、Uva 624 CD 常规的01背包,但要输出路径,状态转移时记录当前状态下当前物品是否被选用,然后递归求解就好。 解题报告
      5、Uva 562 Dividing coins 平衡问题,将n个硬币的总价值累加得到sum,再用sum/2作为背包容量对n个硬币做01背包处理,看能组成的最大容量是多少。 解题报告
      6、Hdu 2955 Robberies (推荐)抢劫方案最优问题,需要一个简单地转换,我们求的是不被抓的概率而非被抓的概率,各个银行的储蓄总和为背包容量,体积为单个银行 的储蓄,价值为不被抓概率。 解题报告
       7、Poj 2184 Cow Exhibition(推荐)变形的01背包,其实问题的本质是保证智商和幽默感和不为负数情况下的最大和。智商属性体积,幽默感属性为价值,问题转换为求体积大等于0时的体积、价值总和。  解题报告
      8、Hdu 2639 Bone Collector II  求价值第K大的01背包问题,技巧是多加一维表示第k大时的价值,转移的时候用两个有序数列合并的方法不断更新第二维。 解题报告
       9、Poj 2923 Relocation(推荐,较综合) 用到状态压缩思想的01背包。先枚举选若干个时的状态,总状态量为1<<n,判断集合里的物品能否一次运走,如果能运走,那就把这个状态看成一个物品。预处理完找到tot个物品,再对这tot个物品进行01背包处理,每个物品的体积是state[i],价值是1,求必选n个物品的最少价值。状态转移方程:dp[j|k] = min(dp[j|k],dp[k]+1) (k为state[i,1<=j<=(1<<n)-1])
     10、Hdu 3466 Proud Merchants 与顺序有关的01背包,先按q-p排序再来处理,难想容易敲。 解题报告
11、Hdu 2126 Buy the souvenirs  n个物品,m元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数。加一维表示已经买几件物品。 解题报告
12、Hdu 4281 Judges' response(推荐,综合题)  和以上第9的思路差不多,但这题的判断条件更简单,本题还有一问是mTSP,甚是经典。详细题解见Here

    二、完全背包问题(先枚举物品,再正序枚举容量)

1、 Uva 674 Coin Change 完全背包求解方案数问题,只有5种硬币,基础题。      解题报告
2、 Uva 147 Dollars 上一题的加强版,硬币有11种,另外这题用double输入,要考虑精度问题。        解题报告
3、 Poj 3181 Dollar Dayz   必须 用高精度模拟的完全背包。         解题报告
4、Poj 1787 Charlie's Change  这题本来是多重背包的题目,但是完全背包求解速度奇快。           解题报告
  5 Poj 3260 The Fewest Coins(推荐,较综合)  完全背包和多重背包混合题,先用完全背包预处理煤老板找钱的最小硬币数,再用多重背包求用到的最小硬币数。
6 Poj 2063 Investment  求投资k年获得最大投资,每年都选最大利息的方案进行投资k年后就可以得到最多的人民币。
7、3623 Battle Ships   建塔打大怪兽,有n种塔,任意建多少个,建塔有时间,建好的塔可以一直打怪兽。把时间当作容量,把打对方多少血当作价值。
8 、Zoj 3524 Crazy Shopping (推荐)  拓朴排序+完全背包,先拓朴排序,注意可能有好几个起点,然后按照拓扑序转移,每转移一次就对下一个点进行完全背包,同时注意更 新所用的能量。 
     9、Zoj 3662 Math Magic  刚结束的长春区域赛的H题,把每个m的因子当作物品,要求我们随便选k个物品,使得这些物品的总和为n,Lcm为m。dp[i][j][k]表示选了i个物品,和为jlcm为k的方案数,具体做法是先预处理找出m的所有因子,这样不管怎么选,最后都有可能Lcm为m,免除很多无必要的计算,然后用这类背包的方法进行转移。

      1、Hdu 1114 Piggy-Bank  简单多重背包,但当成01背包来暴力也完全没有问题,
      2、Hdu 1059 Dividing 简单多重背包,体积为硬币数,价值为币值,可用二进制处理成01背包求解,可用30对num进行优化。
      3、Hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 标题超长超简单的多重背包,可用01背包求解。
      4、Poj 1276 Cash Machine 多重背包,需用二进制处理成01背包求解,体积是硬币数量,价值是币值。
      5、Poj 2392 Space Elevator 最大容量不定的多重背包,体积是每种木块的高度,由于可行性问题无价值这个概念。

       1、Hdu 1712 ACboy needs your help 选课复习问题,没门课只能选一次,找个时间复习,求最大的收益。每门课对应一组,每个时间对应一个物品。
       2、Hdu 3033 I love sneakers!  xx买鞋问题,分组背包的变形,每种牌子至少选一双,这与分组的最多选一个不一样,但思想一样,物品为每种牌子的各种鞋子。
       3、Poj 1837 Balance 平衡问题,把每个砝码在每个位置的权值算出来,每个砝码一个分组,几个位置几个物品,最后求的是价值和为0的方案数。
       4、Poj 3211 Washing Clothes Show幸福题,每种颜色的衣服的分到一组,费用是洗一件衣服的时间,每组求解出最少时间,再逐组累加起来。
       5、Hdu 3810 Magina (推荐,综合)  搜索加分组背包,分组背包必须用单调队列模拟,因为容量特别大,没办法按照常规进行转移。
       6Hdu 3535 AreYou Busy  (推荐,混合背包),各种背包混合,要求对01、完全、多重背包都有深入的理解。

2、Hdu 1011  Starship Troopers  和上题相似,要选择父节点必先子节点,特判m为0的时候。
3、Poj 1947 Rebuilding Roads 求最少删除几条边使得子树节点个数为p,具体的模型和上题很像。解题报告 Here
4、Hdu 1561 The more, The Better 在一棵树上选择若干个点获得的最大价值,选子节点必须先选父节点,求解情况和上两题相同。解题报告 Here
5、Hdu 4003 Find Metal Mineral (推荐,好题) 树形DP+选且只能选一个物品的分组背包,状态转移方程难想。解题报告 here
6、Poj 2486 Apple Tree 树形DP+分组背包,但是状态转移方程要分三步,较为难想。解题报告 Here
7、Poj 3345 Bribing FIPA  树形DP+分组背包,和前面几题相比没有特殊的地方,只是要注意输入。具体可见 Here
8、Hdu 4044 GeoDefense 树形DP+分组背包,要求从每个儿子结点获取最小的hp,然后找这些儿子的最大组合,不是特别好想。解题报告见 Here
       9、Zoj 3627 Treasure Hunt II  树形DP +分组背包,浙大月赛的水题,很普通的树形背包。


这篇文章将会不断更新,以后没遇到这五类背包,我都会整理进这个专题,希望大家保持关注。
本文ZeroClock原创,但可以转载,因为我们是兄弟。

http://www.ppmy.cn/news/541358.html

相关文章

【干货推荐】推荐一个 Github

给大家推荐一个 Github&#xff0c;保证干货满满&#xff1a;https://github.com/iamshuaidi/CS-Book

推荐算法-用户推荐(UserCF)和物品推荐(ItemCF)对比

一、定义 UserCF&#xff1a;推荐那些和他有共同兴趣爱好的用户喜欢的物品 ItemCF&#xff1a;推荐那些和他之前喜欢的物品类似的物品 根据用户推荐重点是反应和用户兴趣相似的小群体的热点&#xff0c;根据物品推荐着重与用户过去的历史兴趣&#xff0c;即&#xff1a; Use…

移远EC600低功耗唤醒锁wakelock的使用,QuecPython功耗分析

移远QuecPython在线文档对 低功耗休眠唤醒 的介绍比较少&#xff0c;咨询FAE后才知道相关说明是在另一个页面 QuecPython低功耗。 EC600模组如何进入低功耗 模组如果需要需要进入低功耗模式&#xff0c;必须满足以下几个条件&#xff1a; USB 拔出系统唤醒锁全部释放&#xff…

移远QuecPython(基于EC600s)开发物联网应用(二) GPIO PWM ADC UART

一. GPIO 1. 创建gpio对象 from machine import Pin gpio Pin(GPIOn, direction, pullMode, level) 参数: GPIOn: 引脚号 int类型 EC600SCN/EC600NCN平台引脚对应关系如下(引脚号为模块外部引脚编号)&#xff1a; GPIO1 – 引脚号10 GPIO2 – 引脚号11 GPIO3 – 引脚号12 GPIO…

MySQL因为hung住,自动重新启动,InnoDB: Semaphore wait has lasted > 600 seconds

从错误日志中检查&#xff0c;有两个信号量等待时间超长&#xff0c;MySQL自动crash了&#xff1a; # grep " 600 " 31-226-mysql-error.log 2021-12-27T02:25:15.086231Z 0 [ERROR] [FATAL] InnoDB: Semaphore wait has lasted > 600 seconds. We intentionall…

移远EC600S-CN (4) - MQTT接入阿里云

MQTT是一种基于 发布/订阅 模式的轻量级通信协议。MQTT专门针对 物联网设备 开发&#xff0c;是一种 低开销、低带宽占用的即时通讯协议。该协议构建于 TCP/IP 上&#xff0c;旨在为低带宽和不稳定网络环境中的物联网设备&#xff0c;提供可靠的网络服务。它的设计思想是简单、…

大学生html5实训心得体会,实训心得体会600字(精选5篇)

实训心得体会600字(精选5篇) 当我们心中积累了不少感想和见解时,写一篇心得体会,记录下来,这样我们就可以提高对思维的训练。但是心得体会有什么要求呢?下面是小编帮大家整理的实训心得体会600字(精选5篇),欢迎阅读,希望大家能够喜欢。 实训心得体会600字1 时间过的真快,…

移远ec200/600的使用

移远ec200、ec600的使用&#xff1a; linux2.6.22 pppd-2.4.4 ec600s 参考的是ec200s的拨号相关文档&#xff1a; 1:/driver/usb/serial/option.c更改了4个位置&#xff0c;并没 有严格按照ec200s的指导文档来&#xff08;2.6.30以上、3.0以上内核还会涉及wwan、qcserial相…