动态规划的问题,一般是先解决子问题,然后由子问题推导,逐步解决大问题,所以我们可以先解决1千克的背包能够获得的最大价值,2千克的背包能够获得的最大价值,直到4千克的背包能够获得的最大价值。首先我们先搞定状态以及转移方程。我们这里定义状态f[i][v],表示前i件物品恰好放入一个容量为v的背包可以获得的最大价值。仔细想一下,我现在获得的最大价值可以建立在第 i 个物品我不偷,那重量是v;也可以是第 i 个物品我偷了,那么前 i-1 个物品的总重量是 v-c[i] ,再加上我现在准备偷的第 i 个物品的价值 v[i],取两者的最大值即可。那么,转移方程就是: f [ i [ [ v ] = m a x ( f [ i − 1 ] [ v ] , f [ i − 1 ] [ v − c [ i ] ] + v [ i ] ) f[i[[v] = max(f[i-1][v],f[i-1][v-c[i]]+v[i]) f[i[[v]=max(f[i−1][v],f[i−1][v−c[i]]+v[i])