搜狗笔试:N个正实数选出若干个之和最接近M

搜狗:有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度。

public class SearchN 

{
    private boolean dataflag[];
    private double  data[];
    private double  min;
    private double  m;
    public void setDataflag(boolean[] dataflag) {
this.dataflag = dataflag;
}


public void setData(double[] data) {
this.data = data;
}
    public void setM(double m) {
   
this.m = m;
this.min=m;
}
public void search(int i,double result,boolean falgtemp[],boolean flag)
    {
if(flag)result+=data[i];
falgtemp[i]=flag;
if(Math.abs(m-result)<min)
{
min=m-result;
System.arraycopy(falgtemp, 0, dataflag, 0, data.length);
}

    if(i<data.length-1)
    {
    search(i+1,result,falgtemp,true);
    search(i+1,result,falgtemp,false);
    }
    }
public void doWork()
{
search(0,0,new boolean[data.length],true);
search(0,0,new boolean[data.length],false);
}
public void displayHeap()
    {
    for(int i=0;i<data.length;i++)
    if(dataflag[i])System.out.print(data[i]+" ");
    }


public static void main(String[] args)
{
double[] A = new double[] {1.5,2.5,3.0};
boolean[] E = new boolean[A.length];
SearchN n=new SearchN();
n.setData(A);n.setDataflag(E);n.setM(5.5);
n.doWork();
n.displayHeap();

}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值