应用回溯法或分支限界法完成java代码:0-1背包问题:假设有4个物品,其重量分别为(4, 7, 5, 3),价值分别为(40, 42, 25, 12),背包容量W=10,分别输出符合要求的装入背包的商品及其价值。
时间: 2024-12-16 22:16:23 浏览: 22
在Java中,我们可以使用回溯法(Backtracking)或者分支限界法(Branch and Bound)解决0-1背包问题。这里我将展示使用回溯法的一个简单示例:
```java
public class Knapsack {
static int[] weights = {4, 7, 5, 3};
static int[] values = {40, 42, 25, 12};
static int W = 10;
// 定义一个函数来判断给定重量是否能放入背包
private static boolean canFit(int weight) {
return weight <= W;
}
// 回溯函数,dp[i] 表示前i个物品的最大价值
private static void backtrack(int i, int dp[]) {
if (i == weights.length) return; // 所有物品都已考虑,结束当前路径
// 如果背包还有空间,尝试装入当前物品
if (canFit(weights[i])) {
dp[i] = Math.max(values[i] + dp[i - 1], dp[i - 1]); // 装入物品
} else {
// 背包已经满,不装入
dp[i] = dp[i - 1];
}
// 继续寻找其他物品
backtrack(i + 1, dp);
}
public static void main(String[] args) {
int[] dp = new int[weights.length]; // 初始化动态规划数组
dp[0] = 0; // 空背包的价值为0
// 开始回溯搜索
backtrack(0, dp);
System.out.println("最优解(商品和价值):");
for (int i = 0; i < weights.length; i++) {
if (dp[i] != dp[i - 1]) { // 只打印非零值对应的商品
System.out.printf("物品 %d, 价值 %d\n", i + 1, values[i]);
}
}
}
}
```
这个代码首先初始化一个动态规划数组`dp`,然后通过递归的方式尝试所有可能的商品组合,并更新最大价值。最后输出的是背包内包含的商品及其对应的总价值。
阅读全文