java贪心算法01背包问题
时间: 2023-11-10 20:04:31 浏览: 93
好的,针对您的问题,我可以给出以下的解答:
01背包问题是指有一个背包,它的容量为C(Capacity),现在有n种不同的物品,编号为0...n-1,其中每一件物品的重量为w(i),价值为v(i)。问可以向这个背包中盛放哪些物品,使得在不超过背包容量的前提下,物品的总价值最大。
Java中可以使用贪心算法来解决01背包问题,具体思路是将物品按照单位重量的价值从大到小排序,然后依次将单位重量价值最大的物品放入背包中,直到背包无法再放入物品为止。
以下是Java代码实现:
```
public class KnapsackProblem {
public static void main(String[] args) {
int[] w = {2, 3, 4, 5}; // 物品重量
int[] v = {3, 4, 5, 6}; // 物品价值
int c = 8; // 背包容量
int n = w.length; // 物品数量
double[] unitValue = new double[n]; // 单位重量价值
for (int i = 0; i < n; i++) {
unitValue[i] = (double) v[i] / w[i];
}
// 将物品按照单位重量价值从大到小排序
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (unitValue[i] < unitValue[j]) {
double temp = unitValue[i];
unitValue[i] = unitValue[j];
unitValue[j] = temp;
int tempW = w[i];
w[i] = w[j];
w[j] = tempW;
int tempV = v[i];
v[i] = v[j];
v[j] = tempV;
}
}
}
int[] x = new int[n]; // 记录物品是否放入背包中
int maxValue = 0; // 背包中物品的最大价值
for (int i = 0; i < n; i++) {
if (w[i] <= c) { // 物品可以完全放入背包中
x[i] = 1;
c -= w[i];
maxValue += v[i];
} else { // 物品只能部分放入背包中
x[i] = 0;
maxValue += (int) (unitValue[i] * c);
break;
}
}
System.out.println("物品放入背包的情况为:");
for (int i = 0; i < n; i++) {
System.out.print(x[i] + " ");
}
System.out.println("\n背包中物品的最大价值为:" + maxValue);
}
}
```
阅读全文