/**
* Copyright (C), 2018-2020
* FileName: 背包问题01问题
* Author: xjl
* Date: 2020/9/13 14:28
* Description:
*/
package 动态规划问题集合;
import java.util.Arrays;
public class 背包问题01问题 {
int[][] memo;
/**
* 01背包问题
*
* @param W
* @param V
* @param C
* @return
*/
public int Kapsack01(int[] W, int[] V, int C) {
int n = W.length - 1;
return bestValue(W, V, n, C);
}
/**
* 表示的是的【0 ……index】的物品的填充的容积为C的背包的最大的价值
*
* @param w
* @param v
* @param index
* @param c
* @return
*/
private int bestValue(int[] w, int[] v, int index, int c) {
if (index < 0 || c = w[index]) {
res=Math.max(res, v[index] + bestValue(w, v, index - 1, c - w[index]));
}
return res;
}
/**
* 采用的是记忆化搜索的形式来实现
*
* @param W
* @param V
* @param C
* @return
*/
public int Kapsack02(int[] W, int[] V, int C) {
int n = W.length - 1;
memo = new int[n + 1][C + 1];
Arrays.fill(memo, -1);
return bestValue1(W, V, n, C);
}
/**
* 表示的是的【0 ……index】的物品的填充的容积为C的背包的最大的价值
* 采用个的是记忆化搜索的来实现的这样的一个效果
*
* @param w
* @param v
* @param index
* @param c
* @return
*/
private int bestValue1(int[] w, int[] v, int index, int c) {
if (index < 0 || c = w[index]) {
res=Math.max(res, v[index] + bestValue1(w, v, index - 1, c - w[index]));
}
memo[index][c] = res;
return res;
}
}