JAvaダイナミックプランニング(リュックサック問題)コード実装
17161 ワード
/**
* @author Drug
* @create 2020-05-12 15:46
*/
public class KnapsackProblem {
public static void main(String[] args) {
//
int[] w = {
1, 4, 3};
//
int[] value = {
1500, 3000, 2000};
//
int m = 4;
//
int n = value.length;
//
int[][] v = new int[n + 1][m + 1];
//
int[][] path = new int[n + 1][m + 1];
// 0
for (int i = 0; i < v.length; i++) {
v[i][0] = 0;
}
for (int i = 0; i < v[0].length; i++) {
v[0][i] = 0;
}
//
for (int i = 1; i < v.length; i++) {
// 1 4
for (int j = 1; j < v[0].length; j++) {
//
if (w[i - 1] > j) {
//
v[i][j] = v[i - 1][j];
} else {
//
//
//value[i - 1] + v[i-1][j-w[i-1]]
//v[i-1][j]
//
if ((value[i - 1] + v[i - 1][j - w[i - 1]]) >= v[i - 1][j]) {
//
v[i][j] = (value[i - 1] + v[i - 1][j - w[i - 1]]);
// [i][j]
path[i][j] = 1;
} else {
//
v[i][j] = v[i - 1][j];
}
}
}
}
//
for (int i = 0; i < v.length; i++) {
for (int j = 0; j < v[0].length; j++) {
System.out.print(v[i][j] + " ");
}
System.out.println();
}
System.out.println(" ");
// , path 1
//path
int i = path.length - 1;
//path
int j = path[0].length - 1;
//
while(i > 0 && j>0){
//
if(path[i][j] == 1){
System.out.println(" "+i+" ");
//
j -= w[i-1];
}
// 1
i--;
}
}
}