回溯法解决01背包问题java实现
时间: 2023-07-07 10:25:32 浏览: 104
回溯法-01背包问题 java
好的,下面是使用回溯法解决01背包问题的Java实现代码:
```java
public class KnapsackProblem {
private static int maxWeight = 0; // 最大价值
private static int[] weight; // 物品重量数组
private static int[] value; // 物品价值数组
private static int n; // 物品数量
private static int w; // 背包容量
public static void main(String[] args) {
// 初始化数据
weight = new int[]{2, 2, 6, 5, 4}; // 物品重量
value = new int[]{6, 3, 5, 4, 6}; // 物品价值
n = 5; // 物品数量
w = 10; // 背包容量
backtracking(0, 0, 0);
System.out.println("最大价值:" + maxWeight);
}
/**
* 回溯法求解01背包问题
*
* @param i 当前物品下标
* @param cw 当前物品重量之和
* @param cv 当前物品价值之和
*/
private static void backtracking(int i, int cw, int cv) {
if (cw == w || i == n) { // 达到边界条件
if (cv > maxWeight) {
maxWeight = cv;
}
return;
}
// 不选择第i个物品
backtracking(i + 1, cw, cv);
// 选择第i个物品
if (cw + weight[i] <= w) {
backtracking(i + 1, cw + weight[i], cv + value[i]);
}
}
}
```
在上面的代码中,我们使用了`weight`数组来存储每个物品的重量,`value`数组来存储每个物品的价值,`n`表示物品的数量,`w`表示背包的容量。`maxWeight`用来存储最大的价值。
在`backtracking`方法中,如果`cw`等于`w`或者`i`等于`n`,表示已经达到了边界条件,根据当前的价值`cv`更新`maxWeight`即可。否则,我们可以选择不选择第`i`个物品,也可以选择第`i`个物品。如果选择第`i`个物品,需要判断当前的重量是否超过了背包的容量。
阅读全文