如何解决Java中的小背包实施但不是正确答案
我在用分数分数背包实现时遇到问题。我没有得到正确的答案。
这是我的代码:
import java.util.Scanner;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import static java.lang.Integer.min;
public class FractionalKnapsack {
// this method for calculating the maximum index
public static int select_max_index(int[] values,int[] weights,int n) {
int index = -1;
double max = 0;
for (int i = 1; i <= n; i++) {
if (weights[i] > 0 && (double) values[i] / (double) weights[i] > max) {
max = (double) values[i] / (double) weights[i];
index = i;
}
}
return index;
}
private static double getOptimalValue(int capacity,int[] values,int n) {
// fractional knapsack problem
DecimalFormat df = new DecimalFormat("#.####"); // for getting the decimal point upto 4 digits
df.setRoundingMode(RoundingMode.CEILING);
int i;
double value = 0.0000d;
if (capacity == 0)
return value;
for (i = 0; i < n; i++) {
int max_index = select_max_index(values,weights,n);// call the maximum index
if (max_index >= 0) {
int b = min(capacity,(weights[max_index]));
value = value + b * ((double) values[max_index] / (double) weights[max_index]);
weights[i] = (weights[max_index] - b);
capacity = capacity - b;
}
}
return Double.parseDouble(df.format(value));
//return value;
}
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int capacity = scanner.nextInt();
int[] values = new int[n + 2];
int[] weights = new int[n + 2];
for (int i = 0; i < n; i++) {
values[i] = scanner.nextInt();
weights[i] = scanner.nextInt();
}
System.out.println(getOptimalValue(capacity,values,n));
}
}
输入:
3 50
60 20
100 50
120 30
正确的输出:
180.0000
我的输出:
200.0
我已遵循所有步骤。但是有两个问题:
-
点后四舍五入。
-
对于某些值,我的答案与预期答案之间存在很大差距。
解决方法
这个背包可以更换吗?通常在小背包中,一旦您选择了一项就无法再次选择它。在执行select_max_index时,似乎总是选择最高值/比率,这意味着您将始终使用它。在您的示例中: 首选是value = 120,权重为30,因此仍为20。
然后您再次选择value = 120,但是这次您将其值的2/3调整为80
这就是为什么您获得200。
您需要修正您的代码,以便不必始终选择同一项目。最简单的方法是将优先级队列与deleteMin或deleteMax
一起使用版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。