背包问题概述(Lintcode- 562.Backpack IV问题解决)
什么是背包问题 背包问题 (Knapsack problem)是一种 组合优化 的 NP完全 问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。 背包问题是动态规划算法的一个典型实例。 动态规划 是对解最优化问题的一种途径。它往往是针对一种最优化问题,根据问题的不同性质,确定不同的设计方法。详细可以查到往期文章进行回顾,这里主要围绕Lintcode 平台中的一个算法编程问题展开讲解。 背包问题的类型 背包问题分为0/1背包,多重背包、完全背包这三大类: 0/1背包问题描述:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 对于一种物品,要么装入背包,要么不装。所以对于一种物品的装入状态可以取0和1.我们设物品i的装入状态为xi,xi∈ (0,1),此问题称为0/1背包问题。 例子:01背包问题描述:有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,每件物品数量只有一个,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和? 完全背包问题描述:有N种物品和一个容量为V的背包,每种物品都有无限件可用