用动态规划算法求解0-1背包问题。最后输出商品编号,JAVA代码
时间: 2024-12-22 10:27:01 浏览: 10
动态规划通常用于解决最优化问题,比如0-1背包问题,它是一个经典的组合优化问题。在0-1背包问题中,给定一组物品,每个物品有自己的价值和重量,目标是在不超过背包容量的情况下选择物品,使得总价值最大。
下面是使用Java编写的基本动态规划算法来解决0-1背包问题的一个示例:
```java
public class Knapsack {
public static int knapSack(int W, int wt[], int val[], int n) {
int[][] K = new int[n + 1][W + 1];
// 构建表格
for (int i = 0; i <= n; i++) {
for (int w = 0; w <= W; w++) {
if (i == 0 || w == 0)
K[i][w] = 0;
else if (wt[i - 1] <= w)
K[i][w] = Math.max(val[i - 1] + K[i - 1][w - wt[i - 1]], K[i - 1][w]);
else
K[i][w] = K[i - 1][w];
}
}
// 返回最大的价值
return K[n][W];
}
// 主函数
public static void main(String args[]) {
int val[] = {60, 100, 120}; // 物品的价值
int wt[] = {10, 20, 30}; // 物品的重量
int W = 50; // 背包的容量
int n = val.length;
System.out.println("最大价值为 " + knapSack(W, wt, val, n));
// 找出包含最大价值的商品集合
int[] maxItems = new int[n];
int curWeight = W;
for (int i = n - 1; i >= 0 && curWeight > 0; i--) {
if (val[i] <= curWeight) {
maxItems[i] = 1;
curWeight -= wt[i];
} else {
maxItems[i] = 0;
}
}
System.out.println("包含的商品编号有: ");
for (int i = 0; i < n; i++) {
if (maxItems[i] == 1) {
System.out.println(i);
}
}
}
}
```
这个程序首先计算了在给定背包容量下可以获得的最大价值,然后根据动态规划表找到能形成这个最大价值的物品集合。注意这只是一个基本版本,实际应用中可能需要处理更复杂的情况,如多个背包、连续的物品等。
阅读全文