类似背包问题,在n个实数中找到和最接近sum的几个数

来源:互联网 发布:java file 文件类型 编辑:程序博客网 时间:2024/04/28 00:35

首先通过biggest方法获取最接近sum的和m,然后使用bag01D方法得到n个实数中和为m的几个数,这样相当于进行了两个背包问题的求解,大家有没有什么更好的方法能在biggest方法中就得到和为m的几个数呢??

代码如下:

 LinkedList<Double> listForBag01D=new LinkedList<Double>();    /**     * 从data数组下标1到n内找到和为sum的一组数字     * @param data     * @param n     * @param sum     */    public void bag01D(double[] data,double sum,int n){        if(n<0||sum<0)return ;        if(Math.abs(sum-data[n])<0.000001){//比较double值的相等            System.out.println(listForBag01D );            System.out.println(data[n]);        }        listForBag01D.push(data[n]);        bag01D(data,sum-data[n],n-1);        listForBag01D.pop();        bag01D(data,sum,n-1);    }            LinkedList<Double> doubleList=new LinkedList<Double>();    /**     * 从data中找到最接近于sum的和     * @param data     * @param index     * @param sum     * @return     */    public double biggest(double[] data,int index,double sum){        if(index<0||sum<=0)            return 0;        double with=Double.MIN_VALUE   ,without=Double.MIN_VALUE;        if(sum>=data[index]){           // doubleList.push(data[index]);            with=biggest(data,index-1,sum-data[index])+data[index];                    }        without=biggest(data,index-1,sum);        if(with>without){           // System.out.println(data[index]);            return with;        }else return without;       // return Math.max(with,without );         }