天天看点

动态规划算法-01背包

一、问题描述

有n个物品,第i个物品的体积为ci,价值为wi,还有一个容积为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-ci,最大价值应该是i-1个物品的最大值加上第i个物品的价值即f(i-1,v-ci) + wi

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

f(i, v) = max{ f(i-1, v),  f(i-1, v-ci) + wi }

步骤3:算法实现。

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

三、总结

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

动态规划算法-01背包

继续阅读