经典动态规划——背包问题系列一
经典动态规划——背包问题系列一 复赛前发一波博客,虽然意义不是很大了…… 本篇讲的是背包问题基础 01背包问题 简述 有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 思路 动态规划的基本题,背包问题之母。 对动态规划有一定了解的人应该都应理解它的原理和方程。 所谓动态规划,就是把问题分成互相联系的多个阶段决策,每一步决策都能影响答案。当然,各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展。那么我们需要确定,各阶段之间的关系是什么以及各状态如何决策才能使答案最优。 在背包问题中,我们通常把背包容量设为状态。那么我们需要决策,到底如何放置物品,才能使各阶段背包在有限容量内装价值最多的物品? 首先我们需要知道:背包容量大的状态一定由容量小的状态转移过来,因为我们要不断选物品,这样是总重量越来越大。现在我们用f[i][j]示前i件物品恰放入一个容量为v的背包可以获得的最大价值。 我们只要枚举物品,在有限的空间里取物品,并一直取max,就能在规定背包空间内跑完。 \[ dp[i][v] = max(dp[i-1][v],dp[i-1][v-c[i]]+w[i]) \] 为什么要逆着枚举?因为容量大的状态要从容量小的状态转移过来,而我们要固定每个容量去装物品