Java 分数背包问题

Java 分数背包问题,java,algorithm,Java,Algorithm,下面是我用Java实现的代码。函数返回最大元素的索引。问题是,我没有得到一个正确的测试用例。我不知道是哪一个,但在线法官给了我以下警告: 失败案例#7/13:回答错误 获得:66152.57预期:66152.572 (使用时间:0.19/1.50,使用内存:24469504/671088640。) 公共类{ 私有静态双getOptimalValue(int容量、int[]值、int[]权重){ 浮点数=0; //在这里编写代码 浮动[]比率=新浮动[值.长度]; 对于(int i=0;i-1)

下面是我用Java实现的代码。函数返回最大元素的索引。问题是,我没有得到一个正确的测试用例。我不知道是哪一个,但在线法官给了我以下警告:

失败案例#7/13:回答错误 获得:66152.57预期:66152.572 (使用时间:0.19/1.50,使用内存:24469504/671088640。)

公共类{
私有静态双getOptimalValue(int容量、int[]值、int[]权重){
浮点数=0;
//在这里编写代码
浮动[]比率=新浮动[值.长度];
对于(int i=0;i-1)
{
max=getMax(比率);
如果(容量==0)
{
返回值;
}
如果(容量>0)
{
if(重量[最大]>=容量)
{
值=值+((浮动)比率[max]*(浮动)(容量));
容量=0;
}
否则,如果(容量>重量[最大])
{
值=值+(权重[max]*比率[max]);
容量=容量重量[最大值];
}
比率[max]=0;
}
}
返回值;
}
私有静态int getMax(浮点[]arr)
{
浮动最大值=0;
int save=0;
对于(int i=0;imax)
{
max=arr[i];
save=i;
}
}
返回保存;
}
公共静态void main(字符串参数[]){
扫描仪=新的扫描仪(System.in);
int n=scanner.nextInt();
int capacity=scanner.nextInt();
int[]值=新的int[n];
int[]权重=新的int[n];
对于(int i=0;i

}

您使用的
float
类型无法区分66152.57(您的输出)和66152.572(所需输出)。例如,你可以在线查看。看,尾数只有23位的存储空间,这意味着相对误差可能在2-24之间。对于震级66152.572,表示绝对误差为0.003943。如果您对为什么更感兴趣,请查阅一些浮点指南(如)

解决方案是使用
double
进行浮点计算。
请注意,除非您确实知道
float
精度对于您的应用程序来说已经足够,
double
几乎总是正确的类型,以避免这种不幸的影响。

您的答案在.002之前是错的,所以一定是打印中的一些简单的舍入错误或格式问题,这是一个非常接近的答案。只是猜测一下,但是你试过用双打吗?
public class FractionalKnapsack {
private static double getOptimalValue(int capacity, int[] values, int[] weights) {
    float value = 0;
    //write your code here
    float[] ratio=new float[values.length];
    for(int i=0;i<values.length;i++)
    {
        ratio[i]=(float)values[i]/(float)weights[i];
    }
    int max=0;

    while(capacity>-1)
    {
        max=getMax(ratio);
        if(capacity==0)
        {
            return value;
        }
        if(capacity>0)
        {
            if(weights[max]>=capacity)
            {
                value=value+((float)ratio[max]*(float)(capacity));
                capacity=0;
            }
            else if(capacity>weights[max])
            {
                value=value+(weights[max]*ratio[max]);
                capacity=capacity-weights[max];
            }
            ratio[max]=0;
        }
    }
    return value;
}
private static int getMax(float[] arr)
{
    float max=0;
    int save=0;
    for(int i=0;i<arr.length;i++)
    {
        if(arr[i]>max)
        {
            max=arr[i];
            save=i;
        }
    }
    return save;
}
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];
    int[] weights = new int[n];
    for (int i = 0; i < n; i++) {
        values[i] = scanner.nextInt();
        weights[i] = scanner.nextInt();
    }
    DecimalFormat df = new DecimalFormat();
    df.applyPattern(".0000");
    System.out.println(df.format(getOptimalValue(capacity, values, weights)));
}