数据结构与算法
背包问题01
题目类型描述: 给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高(from 百度百科)。
具象理解:
假设背包总容量top_weight为10,现共有四样物品(每样各一个),他们的重量和价格分别为:
当我们直观看到这幅表的时候基本可以确定我们会选择1,2,4号物品,这样可以最大程度地装载物品且使利润最大化(为13),但作为计算机,我们还不知道选择时应该遵从的原则(人有时候也不知道自己时如何做出选择的,尤其是我们不太确定是否将背包占满后利润一定最大),这是需要人为给计算机导入法则,让它按照我们规定好的路线安排物品的选取。
抽象建模:
我们可以构建一个二维数组(或两个数组),在第一行存储各个物品的价格,第二行存储其重量,接下来电脑要做的事情就是根据我们给出的top_weight,从这n个物品中给出方案。
分治法:
顾名思义,分而治之,我们将从“n个中选x个”这个大问题向下分化逐渐变小,比如,我们可以划分为“要不要第n个”和“从n-1个中选x个(不要第n个的话,如果要第n个就选x-1个,其中x未知)”这两个子问题。
显然,我们需要用到递归。
代码如下:
package KnapsackProbleminDynamicProgramming;
//动态规划中的背包问题
//分治法
public class One {
public static void main(String args[]){
int[][] items=new int[2][4];
items[0][0]=2;items[0][1]=4;items[0][2]=3;items[0][3]=7;//第一行存储利润
items[1][0]=2;items[1][1]=3;items[1][2]=5;items[1][3]=5;//第二行存储重量
System.out.println(Solution(items, 10, 0));
}
public static int Solution(