[置顶] 【DP_背包专辑】【8、1最新更新】

2024-02-03 05:38

本文主要是介绍[置顶] 【DP_背包专辑】【8、1最新更新】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

    个人认为背包九讲中的很多模型本质都是两种模型: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元钱,每个物品最多买一次,问最多可以买几件物品,并且输出方案数。加一维表示已经买几件物品。

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

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 (推荐)  拓朴排序+完全背包,先拓朴排序,注意可能有好几个起点,然后按照拓扑序转移,每转移一次就对下一个点进行完全背包,同时注意更                                                                      新所用的能量。 (8、1号更新)

    三、多重背包问题(先枚举物品,再正序枚举容量)

      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、完全、多重背包都有深入的理解。

    五、树形背包问题(在树上进行分组背包处理)

      1、Poj 1155 TELE  把每个节点的子节点看成一组背包,最大容量是这点的叶子子孙数量,选几个节点就是选择的容量,价值就是用户给的Money-中转费用。解题报告 Here
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 +分组背包,浙大月赛的水题,很普通的树形背包。


这篇关于[置顶] 【DP_背包专辑】【8、1最新更新】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/673133

相关文章

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

usaco 1.1 Broken Necklace(DP)

直接上代码 接触的第一道dp ps.大概的思路就是 先从左往右用一个数组在每个点记下蓝或黑的个数 再从右到左算一遍 最后取出最大的即可 核心语句在于: 如果 str[i] = 'r'  ,   rl[i]=rl[i-1]+1, bl[i]=0 如果 str[i] = 'b' ,  bl[i]=bl[i-1]+1, rl[i]=0 如果 str[i] = 'w',  bl[i]=b

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

uva 10154 DP 叠乌龟

题意: 给你几只乌龟,每只乌龟有自身的重量和力量。 每只乌龟的力量可以承受自身体重和在其上的几只乌龟的体重和内。 问最多能叠放几只乌龟。 解析: 先将乌龟按力量从小到大排列。 然后dp的时候从前往后叠,状态转移方程: dp[i][j] = dp[i - 1][j];if (dp[i - 1][j - 1] != inf && dp[i - 1][j - 1] <= t[i]