首页 > 其他分享 >动态规划之 附录一:USACO中的背包问题

动态规划之 附录一:USACO中的背包问题

时间:2023-06-30 21:12:48浏览次数:55  
标签:方案 件物品 可以 USACO 背包 物品 附录

USACO是USA Computing Olympiad的简称,它组织了很多面向全球的计算机竞赛活动。

USACO Trainng是一个很适合初学者的题库,我认为它的特色是题目质量高,循序渐进,还配有不错的课文和题目分析。其中关于背包问题的那篇课文 (TEXT Knapsack Problems) 也值得一看。

另外,USACO Contest是USACO常年组织的面向全球的竞赛系列,在此也推荐NOIP选手参加。

我整理了USACO Training中涉及背包问题的题目,应该可以作为不错的习题。其中标加号的是我比较推荐的,标叹号的是我认为对NOIP选手比较有挑战性的。

题目列表

  • Inflate (+) (基本01背包)
  • Stamps (+)(!) (对初学者有一定挑战性)
  • Money
  • Nuggets
  • Subsets
  • Rockers (+) (另一类有趣的“二维”背包问题)
  • Milk4 (!) (很怪的背包问题问法,较难用纯DP求解)

题目简解

以下文字来自我所撰的《USACO心得》一文,该文的完整版本,包括我的程序,可在DD的USACO征程中找到。

Inflate 是加权01 背包问题,也就是说:每种物品只有一件,只可以选择放或者 不放;而且每种物品有对应的权值,目标是使总权值最大或最小。它最朴素的状态 转移方程是:f[k][i] = max{f[k-1][i] , f[k-1][i-v[k]]+w[k]}。f[k][i]表示前k 件物品花费代 价i 可以得到的最大权值。v[k]和w[k]分别是第k 件物品的花费和权值。可以看到, f[k]的求解过程就是使用第k 件物品对f[k-1]进行更新的过程。那么事实上就不用使用 二维数组,只需要定义f[i],然后对于每件物品k,顺序地检查f[i]与f[i-v[k]]+w[k]的大 小,如果后者更大,就对前者进行更新。这是背包问题中典型的优化方法。

题目stamps 中,每种物品的使用量没有直接限制,但使用物品的总量有限制。 求第一个不能用这有限个物品组成的背包的大小。(可以这样等价地认为)设f[k][i] 表示前k 件物品组成大小为i 的背包, 最少需要物品的数量。则f[k][i]= min{f[k-1][i],f[k-1][i-j*s[k]]+j},其中j 是选择使用第k 件物品的数目,这个方程运用时 可以用和上面一样的方法处理成一维的。求解时先设置一个粗糙的循环上限,即最 大的物品乘最多物品数。

Money 是多重背包问题。也就是每个物品可以使用无限多次。要求解的是构成 一种背包的不同方案总数。基本上就是把一般的多重背包的方程中的min 改成sum 就行了。

Nuggets 的模型也是多重背包。要求求解所给的物品不能恰好放入的背包大小 的最大值(可能不存在)。只需要根据“若i、j 互质,则关于x、y 的不定方程ix+yj=n 必有正整数解,其中n>ij”这一定理得出一个循环的上限。 Subsets 子集和问题相当于物品大小是前N 个自然数时求大小为N(N+1)/4 的 01 背包的方案数。

Rockers 可以利用求解背包问题的思想设计解法。我的状态转移方程如下: f[i][j][t]=max{f[i][j][t-1] , f[i-1][j][t] , f[i-1][j][t-time[i]]+1 , f[i-1][j-1][T]+(t>=time[i])}。其中 f[i][j][t]表示前i 首歌用j 张完整的盘和一张录了t 分钟的盘可以放入的最多歌数,T 是 一张光盘的最大容量,t>=time[i]是一个bool 值转换成int 取值为0 或1。但我后来发 现我当时设计的状态和方程效率有点低,如果换成这样:f[i][j]=(a,b)表示前i 首歌中 选了j 首需要用到a 张完整的光盘以及一张录了b 分钟的光盘,会将时空复杂度都大 大降低。这种将状态的值设为二维的方法值得注意。

Milk4 是这些类背包问题中难度最大的一道了。很多人无法做到将它用纯DP 方 法求解,而是用迭代加深搜索枚举使用的桶,将其转换成多重背包问题再DP。由于 USACO 的数据弱,迭代加深的深度很小,这样也可以AC,但我们还是可以用纯DP 方法将它完美解决的。设f[k]为称量出k 单位牛奶需要的最少的桶数。那么可以用类 似多重背包的方法对f 数组反复更新以求得最小值。然而困难在于如何输出字典序最 小的方案。我们可以对每个i 记录pre_f[i]和pre_v[i]。表示得到i 单位牛奶的过程是 用pre_f[i]单位牛奶加上若干个编号为pre_v[i]的桶的牛奶。这样就可以一步步求得得 到i 单位牛奶的完整方案。为了使方案的字典序最小,我们在每次找到一个耗费桶数 相同的方案时对已储存的方案和新方案进行比较再决定是否更新方案。为了使这种 比较快捷,在使用各种大小的桶对f 数组进行更新时先大后小地进行。USACO 的官 方题解正是这一思路。如果认为以上文字比较难理解可以阅读官方程序或我的程序。

标签:方案,件物品,可以,USACO,背包,物品,附录
From: https://www.cnblogs.com/shoshana-kong/p/17517828.html

相关文章

  • 动态规划之 背包问题问法的变化
    以上涉及的各种背包问题都是要求在背包容量(费用)的限制下求可以取到的最大价值,但背包问题还有很多种灵活的问法,在这里值得提一下。但是我认为,只要深入理解了求背包问题最大价值的方法,即使问法变化了,也是不难想出算法的。例如,求解最多可以放多少件物品或者最多可以装满多少背包的空......
  • 动态规划之有依赖的背包问题
    简化的问题这种背包问题的物品间存在某种“依赖”的关系。也就是说,i依赖于j,表示若选物品i,则必须选物品j。为了简化起见,我们先设没有某个物品既依赖于别的物品,又被别的物品所依赖;另外,没有某件物品同时依赖多件物品。算法这个问题由NOIP2006金明的预算方案一题扩展而来。遵从该题......
  • 动态规划之分组的背包问题
    问题有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。算法这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是......
  • 动态规划之混合三种背包问题
    问题如果将P01、P02、P03混合起来。也就是说,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。应该怎么求解呢?01背包与完全背包的混合考虑到在P01和P02中给出的伪代码只有一处不同,故如果只有两类物品:一类物品只能取一次,另一类......
  • 第三讲 多重背包问题
    题目有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本算法这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物......
  • 第一讲 01背包问题
    题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值......
  • 动态规划-背包问题-完全背包问题:leetcode 377. 组合总和 Ⅳ
    1.题目读题给你一个由不同整数组成的数组nums,和一个目标整数target。请你从nums中找出并返回总和为target的元素组合的个数。题目数据保证答案符合32位整数范围。 示例1:输入:nums=[1,2,3],target=4输出:7解释:所有可能的组合为:(1,1,1,1)(1,1,2)(1,2,......
  • 动态规划 完全背包问题 -游戏最大伤害
     1.题目读题 游戏角色,有技能列表和魔法值,求能造成的最大伤害,例如:输入skill_list:[{mana_cost:10,damage:10},{mana_cost:12,damage:13}],current_mana:20,输出max_damage:20输入skill_list:[{mana_cost:10,damage:10},{mana_cost:12,damage:13}],current......
  • PACM Team (牛客多校) (DP 01背包, 维度较多)
    题目大意:给出n个物品,物品有4个空间值,然后有一个权值问在不超过最大的空间值时,最大的权值  思路:一开始想了很多其他思路没有想出来开始广搜算法,发现dp可以解决(注意看数据范围,是满足的)遇到奇怪的题,就试试dp,特别在数据范围很小的时候 ......
  • maven核心,pom.xml详解(转) 附录A mave的依赖范围 附录B maven常用命令集
    什么是pom?   pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:  -包括配置文件;  -开发者需要遵循的规则,  -缺陷管理系统,  -组织和licenses,  -项目的url,  -项目的依赖性,  -以及其他所有的项目相关因素。 快速......