当前位置:   article > 正文

背包问题的两种解法_第一行两个整数,n,m,用空格隔开,分别表示物品数量和背包容量。 接下来有n组数据:

第一行两个整数,n,m,用空格隔开,分别表示物品数量和背包容量。 接下来有n组数据:

题目描述:

有n件物品 ,每件物品重w[i],价值v[i],

现在需要选出若干件物品放入到一个容量为V的背包中,

当选入物品体积不超过 V时,求最大价值。

输入格式:

第一行两个整数,n,m,用空格隔开,分别表示物品数量和背包容积。接下来有 n 行,每行两个整数 wi,vi,用空格隔开,分别表示第 i 件物品的体积和价值。

输入样例:

输出样例:

数据范围:

对于上面的背包问题我有两种解法分别是动态规划和深度优先搜索。

这是一道典型的01背包问题。首先我来说一下01背包和完全背包的区别:01背包的每件物品只能用一次,完全背包则是每件物品可以重复使用,没有次数限制。

由于这道题是01背包问题,所以主要来说一下01背包。利用动态规划,其目的就是将原问题分解成几个子问题,通过求解简单的子问题,把原问题给解决,和分治法类似。

动态规划,无非就是利用历史记录,来避免我们的重复计算。而这些历史记录,我们得需要一些变量来保存,一般是用一维数组或者二维数组来保存。

动态规划有三个步骤
1、定义数元素的含义
2、找出数组元素之间的关系式,例如斐波那契数列方程:f[i]=f[i-1]+f[i-2];这就是典型的数组元素之间的关系式
3、找出初始值,有了初始值再根据数组元素之间的关系式就能计算出剩余数组元素的值

动态规划的核心就是找到原问题与子问题的关系,并列出动态转移方程。

分析:

根据上面的问题我们可以定义一个二维数组dp[i][j]表示前i个物品放在容量为j的背包时的最大价值。对于第i个物品可以选也可以不选。

如果背包的容量j小于第i个物品的重量w[i]时,则前i个物品在容量为j的背包的最大价值等于前i-1个物品在容量为j的背包中的最大价值,即dp[i][j]=dp[i-1][j];
如果背包的容量j小于第i个物品的重量w[i]时,则前i个物品在容量为j的背包的最大价值等于前i-1个物品在容量为j的背包中的最大价值与第i个物品放在容量为j的背包中的价值加上剩余i-1个物品放在容量为j-w[i]背包中的价值之和的最大值,即dp[i][j]=max(dp[i-1][j],v[i]+dp[i-1][j-w[i]);

由此可知该题的状态转移方程是dp[i][j]=max(dp[i-1][j],v[i]+dp[i-1][j-w[i]);

代码如下

深度优先搜索是指沿着树的某一个分支一直走,直至结尾再回溯,是图遍历算法的一种,用一句话概括就是:“一直往下走,走不通回头,换条路再走,直到无路可走”。

深度优先搜索的基础是递归。

分析:

首先要设置一个数组并初始化为0,这个数组用来表示n个物品是否被访问过,如果被访问则跳过该物品,否则访问该物品,访问过后要赋值为1;

当然要实现上面的步骤需要用到递归,在递归过程中通过背包的容量来计算背包中物品物品的价值,每当生成一个价值,就需要和之前的价值进行比较并且取最大价值,递归结束的条件是如果物品的体积之和大于背包所能容纳的最大体积则结束递归。

以上就是关于背包问题的两种解法。

可以通过以下题目来练习

完全背包问题

多重背包

分组背包

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/401522?site
推荐阅读
相关标签
  

闽ICP备14008679号