package com.gxmedu.knapsack_problem;
import java.util.Arrays;
/**
* @author 郭学明
* @version 1.0
*/
public class KnapsackProblem {
public static void main(String[] args) {
scale = 3;
capacity = 4;
weigh = new int[]{1,4,3};
value = new int[]{1500,3000,2000};
maxValue = new int[scale + 1][capacity + 1];
selection = new int[scale + 1][capacity + 1];
dynamicProgramming();
for (int i = 0; i < maxValue.length; i++) {
System.out.println(Arrays.toString(maxValue[i]));
}
showSelection();
// System.out.println("选择如下编号对应物品");
// for (int i = 0; i < selection.length ; i++) {
// if(selection[i] == 1){
// System.out.println(i + 1);
// }
// }
}
public static int scale;
public static int capacity;
public static int[] weigh = new int[scale] ;
public static int[] value = new int[scale];
/**
* 用来记录某样物品究竟要不要放,在0-1背包问题下取值只为0,1。
* 一维数组不可行,因为有曾经放过,又拿出来这种情况。
*/
public static int[][] selection;
// = new int[scale];
public static int[][] maxValue;
// 数组要在scale赋值后才能动态初始化
// = new int[scale + 1][capacity + 1];
/**
* 数组要在scale赋值后才能动态初始化
* maxValue 表示在 0-1 背包问题背景下,前i个物品在j的最大承重限制下能达到的最大价值。
*/
// static{
// for (int i = 0; i < scale + 1; i++) {
// maxValue[i][0] = 0;
// }
// for (int i = 0; i < capacity + 1; i++) {
// maxValue[0][i] = 0;
// }
// }
public static void dynamicProgramming(){
for (int i = 1; i < scale + 1; i++) {
for (int j = 1;j < capacity + 1; j++) {
if(weigh[i - 1] > j ){
maxValue[i][j] = maxValue[i - 1][j];
}else if(maxValue[i - 1][j] >= value[i - 1] + maxValue[i - 1][j - weigh[i - 1]]){
maxValue[i][j] = maxValue[i - 1][j];
}else{
maxValue[i][j] = maxValue[i - 1][j - weigh[i - 1]] + value[i - 1];
// selection[i - 1] = 1;
selection[i][j] = 1;
}
}
}
}
public static void showSelection(){
int i = scale ;
int j = capacity ;
while(i >= 0 & j >= 0 ){
if(selection[i][j] == 1){
System.out.printf("物品选%d\n",i);
j -= weigh[i - 1];
}
i--;
}
}
}
java dynamic programming
最新推荐文章于 2024-05-31 10:46:10 发布