Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的分数背包实现(但不是正确答案)_Java_Algorithm_Sorting_Knapsack Problem_Greedy - Fatal编程技术网

java中的分数背包实现(但不是正确答案)

java中的分数背包实现(但不是正确答案),java,algorithm,sorting,knapsack-problem,greedy,Java,Algorithm,Sorting,Knapsack Problem,Greedy,我在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 i

我在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[] weights, 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, weights, n));
    }
}
正确输出:

180.0000

我的输出:

200.0

我已经遵循了所有的步骤。但有两个问题:

  • 点后四舍五入至4位

  • 对于某些值,我的答案和预期答案之间存在很大差距


  • 这个背包有替换品吗?通常在分数背包中,一旦你选择了一件物品,你就不能再选择它了。在select_max_索引的实现中,您似乎总是选择最高的值/比率,这意味着您将始终使用它。在您的示例中: 第一个选择是value=120,权重为30,所以剩下20

    然后再次选择value=120,但这次取其值的2/3进行拟合,即80

    这就是为什么你得到200

    您需要修复代码,这样您就不会一直选择同一项。最简单的方法是将优先级队列与deleteMin或deleteMax一起使用

    3 50
    60 20
    100 50
    120 30