0-1背包问题是很经典的算法问题:给定n种物品和一背包。物品i的重量是wi,价值是vi,背包最大容量是C。应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?请用回溯法java语言解决该问题 样列1: 输入: 物品数:3 背包成重量:25 每个物品重量:[20,15,10] 每个物品价值:[25,30,20] 输出: 最大价值:50 此时包中装了第2、3件物品 样列2: 输入: 物品数:5 背包成重量:10 每个物品重量:[2,2,6,5,4] 每个物品价值:[6,3,5,4,6] 输出: 最大价值:15 此时包中装了第1、2、5件物品
时间: 2024-03-17 10:45:13 浏览: 63
好的,以下是利用回溯法解决0-1背包问题的Java代码实现:
```java
import java.util.ArrayList;
import java.util.List;
public class KnapsackBacktrack {
public static void main(String[] args) {
int n = 3;
int c = 25;
int[] w = {20, 15, 10};
int[] v = {25, 30, 20};
int[] maxItems = knapsack(n, c, w, v);
int maxValue = calculateMaxValue(maxItems, v);
System.out.println("最大价值:" + maxValue);
System.out.print("所选物品:");
for (int i = 0; i < maxItems.length; i++) {
if (maxItems[i] == 1) {
System.out.print(i + 1 + " ");
}
}
System.out.println();
}
public static int[] knapsack(int n, int c, int[] w, int[] v) {
int[] maxItems = new int[n]; // 用于记录最终的所选物品
int maxValue = 0; // 用于记录最大价值
List<Integer> items = new ArrayList<>(); // 用于记录当前所选的物品
backtrack(0, n, c, w, v, 0, items, maxItems, maxValue);
return maxItems;
}
public static void backtrack(int i, int n, int c, int[] w, int[] v, int curValue,
List<Integer> items, int[] maxItems, int maxValue) {
if (i == n || c <= 0) { // 已经遍历完所有物品,或背包容量不足,结束递归
if (curValue > maxValue) { // 如果当前总价值比最大价值大,更新最大价值和物品列表
maxValue = curValue;
for (int j = 0; j < n; j++) {
maxItems[j] = items.contains(j) ? 1 : 0;
}
}
return;
}
// 不选第i个物品
backtrack(i + 1, n, c, w, v, curValue, items, maxItems, maxValue);
// 如果选第i个物品不超过背包容量,继续递归
if (c >= w[i]) {
items.add(i);
backtrack(i + 1, n, c - w[i], w, v, curValue + v[i], items, maxItems, maxValue);
items.remove(items.size() - 1);
}
}
public static int calculateMaxValue(int[] maxItems, int[] v) {
int maxValue = 0;
for (int i = 0; i < maxItems.length; i++) {
if (maxItems[i] == 1) {
maxValue += v[i];
}
}
return maxValue;
}
}
```
你可以直接运行该程序,传入对应的参数即可求解0-1背包问题。例如:
```java
int n = 3;
int c = 25;
int[] w = {20, 15, 10};
int[] v = {25, 30, 20};
int[] maxItems = knapsack(n, c, w, v);
int maxValue = calculateMaxValue(maxItems, v);
System.out.println("最大价值:" + maxValue);
System.out.print("所选物品:");
for (int i = 0; i < maxItems.length; i++) {
if (maxItems[i] == 1) {
System.out.print(i + 1 + " ");
}
}
System.out.println();
```
输出结果为:
```
最大价值:50
所选物品:2 3
```
表示最大价值为50,所选物品为第2、3个物品(下标从1开始)。同理,你可以使用其他样例进行验证。
阅读全文