原题来自牛客网
题目描述
有为N件物品,它们的重量w分别是w1,w2,…,wn,它们的价值v分别是v1,v2,…,vn,每件物品数量有且仅有一个,现在给你个承重为M的背包,求背包里装入的物品具有的价值最大总和?
输入描述
物品数量N=5件
重量w分别是2 2 6 5 4
价值v分别是6 3 5 4 6
背包承重为M=10
输出描述
背包内物品最大总和为15
示例
输入
5
10
2 2 6 5 4
6 3 5 4 6
输出
15
解题思路
这是一个01背包问题,可以采用三种方法解决:回溯法、二维数组动态规划、一维数组动态规划。
回溯法的思路是先对每个物品的单位价值进行从大到小排序,然后对每个物品有选或不选两种情况,最终排列出所有的组合,将最大价值返回。
回溯法可以进行剪枝优化,如果在挑选某一个物品时用它的单位价值乘以剩余的空间得到的理论最大价值小于当前全局最优解,就可以直接剪枝不再搜索后续的组合。
二维数组的动态规划采用一个二维数组记录局部最优解,第i行第j列的值表示在容量为j的背包中放入前i个物品的最大价值。
一维数组的动态规划是在二维数组的基础上进行了简化,把记录状态的二维数组换成了一维数组,但是循环遍历的次数还是一样多,只是节省了空间。
具体实现的时候一维数组动态规划需要从后往前遍历来完成内层循环(即从行尾遍历到行首)。
标签:01,一维,问题,二维,背包,数组,物品,价值 来源: https://blog.csdn.net/qq_58374988/article/details/123197639
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。