背包问题描述:
将有限的几个物品放入一个能承受固定重量的背包中,求能背包中物品的最大重量
package cm.com.algorithm.knapsack;
import cm.com.algorithm.knapsack.compare.SortCompare;
import java.util.Arrays;
/**
* 背包问题-动态规划实现
*
* 核心思想:
* 先放置第一个,有两种情况 放置和不放置,结果又两种
* 再在第一个的基础上放置第二个.....以此类推
*
* @author Memorys.liu
* @date 2019-07-03 10:31
*/
public class KnapsackDynamic {
private static final Integer[] goods = new Integer[]{2,4,2,5,4};
private static final int weight = 12;
private static int[] midArray = new int[weight + 1];
public static void main(String[] args) {
//降序排序
Arrays.sort(goods,new SortCompare());
//放置物品
place(goods);
//打印数组中能达到的最大重量值
int i = midArray.length - 1;
while (true){
if (midArray[i] == 1){
System.out.println(i);
break;
}
if (i < 0){
System.out.println(0);
break;
}
i--;
}
}
/**
* 将商品放置到背包中
* @param goods
*/
private static void place(Integer[] goods) {
for (int i = 0; i < goods.length; i++) {
//如果为第一次,则直接赋值,
if (i == 0){
midArray[i] = 1;
midArray[goods[i]] = 1;
continue;
}
//从第二次循环开始,每次都将之前已经赋值的加上本次的值,作为也可以达到的重量
for (int j = midArray.length - 1; j >= 0; j--) {
if (midArray[j] == 1 && j + goods[i] < midArray.length){
midArray[j + goods[i]] = 1;
}
}
}
}
}