一、问题描述

有N个物品,第i个物品的体积为c​i​,价值为w​i​,还有一个容积为V的背包,现在往背包中装物品,怎样才能使得背包内的物品价值最大。


二、分析思路


步骤1:用函数的形式来表示题目结果。

设f(x,V)=y,表示有x个物品,容积为V的背包的最大价值。那么本题要求的便是f(N,V)。


步骤2:分析递推情况。

递推情况分析主要是考虑一般的情况,即f(i)与f(i-1)等之间的关系。

那么本题我们考虑在背包容量限制为V的前提下,有i个物品和i-1个之间的关系。


假如我们现在已经知道f(i-1,V)的值即要装i-1个物品达到的最大值,接下来分析是否要装第i个物品,只有两种情况装或不装。如果不装第i个物品的话,那么体积限制还是V,最大价值是f(i-1,V),如果要装第i个物品,那么i-1个物品的体积限制就应该是V-c​i​,最大价值应该是i-1个物品的最大值加上第i个物品的价值即f(i-1,V-c​i​) + w​i


综上,我们得到如下的递推公式:

f(i, V) = max{ f(i-1, V),  f(i-1, V-c​i​) + w​i ​}


步骤3:算法实现。

如您对该算法感兴趣,“算法与编程之美”公众号将为您做后续讲解。


三、总结

本文给大家介绍了利用动态规划算法求解01背包的问题,您掌握了吗?背包问题除了01背包之外还有很多其他类型的变种,如完全背包等,后续博客将逐一的介绍。


动态规划算法-01背包_01背包