一:通过金矿模型介绍动态规划
二:代码部分
Code:
package DynamicProgarmming;
import java.util.ArrayList;
import java.util.HashMap;
/**
* @author MohnSnow
* @time 2015年6月15日 上午10:19:55
* @title 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,
* 问当从这n个物品中选择多个物品放在包里而物品体积总数不超过包的容量m时,
* 能够得到的最大价值是多少?[对于每个物品不可以取多次,最多只能取一次,
* 之所以叫做01背包,0表示不取,1表示取]
* @INPUT m=10 n=5 [3,6][2,3][6,5][5,4][4,6]
*
*
*/
public class package0and1 {
/**
* @param argsmengdx
* -fnst
*/
/*
* public static int volueSum = 10;
* public static int[] volue = { 3, 2, 6, 5, 4 }; //volue与value一一对应
* public static int[] value = { 6, 3, 5, 4, 6 };
*/
public static int volueSum = 100;
public static int[] volue = { 77, 22, 29, 50, 99 }; //volue与value一一对应
public static int[] value = { 92, 22, 87, 46, 90 };
public static int packageQues(int volueSum, int location) {
if (location < 0) {
return 0;
} else if (location == 0) {
if (volue[0] > volueSum) {
return 0;
} else {
return value[0];
}
} else {
int a, b;
//包括这个点
if (volueSum < volue[location]) {
a = packageQues(volueSum, location - 1);//不得不 不包括
} else {
a = value[location] + packageQues(volueSum - volue[location], location - 1);//不得不 包括
}
//不包括这个点
b = packageQues(volueSum, location - 1);
System.out.println("0/1背包问题分解a为:" + a + " b:为" + b);
return Math.max(a, b);
}
}
public static void main(String[] args) {
int location = volue.length - 1;
//System.out.println("0/1背包问题:" + packageQues(volueSum, location));
System.out.println("0/1背包问题:" + packageQues(100, location));
}
}