在M个值大于5的单精度数中取N个数,求之和最接近与S(S>100)的这N个数的组合。(例如:有M{110.5,99.5,111.5},S=210则得N{110.5,99.5})(最好给出详细代码 C#)

解决方案 »

  1.   

    可以参考下面这个贴子:
    http://community.csdn.net/Expert/topic/3655/3655455.xml
      

  2.   

    哦,比较复杂的算法......DING...
      

  3.   

    比如说有1 1 8 6 9 7 25 这几个数 求n个数相加后他们的和S与12最接近的数的组合 比如说{1 1 9}他们的和S=11与12最接近。
      

  4.   

    我的理解:n应该指1 1 8 6 .....n
    M = 1 + 1 + 8 + 6 + 9 + 7 + 25 + ......n
    S = 1 + 1 + 8 + 6 + 9 + 7 + 25 = 57但已知数12来自哪里?它的取值依据是什么?
      

  5.   

    S是给定的 M是指一共有那么多个数 N是指从总数M中取出的数的个数 而这N个数组成的集合 就是所用求的。这个集合中的所有数想加得到的和与给定的S最接近~`~~
      

  6.   

    奇怪了!它的共和不是始终和 S 最接吗?因为 它们已经相加了啊:
    float[] M = new float[]{1,1 8,6,9,7,25};//相加 = 57
    float S = 34;//假设
    float SUM = 0;//总和
    for(int i = 0; i < M.Length; i++)
    {
      SUM += M[i];//n相加
    }
    //这时只有S = 34 和 SUM = 57 了,你说这结果还有疑问吗?就是 S 始终 和 SUM(M[n])相近啊!
      

  7.   

    如果按 Geranium(魂归阿寒)的理解,那么1 1 8 6 9 7 25 相加后他们的和S与12最接近的数的组合 就不只是 “{1 1 9}他们的和S=11与12最接近”了,而有“{6,7} = 13 ”我想想...
      

  8.   

    是的,不过因为是float类型,相加后相同的组合应该不容易出现。
    关键是怎么求最接近S的那一个组合
    期待楼上的~
      

  9.   

    已实现功能要求,你可以做一些改善。
    public static void Main()
    {
      Test2(new float[]{110.5f,99.5f,111.5f,19.5f},210);  Test2(new float[]{1.5f,2.5f,3.5f,4.5f,6f},10);  Console.Read();
    }public static void Test2(float[] M,float S)
    {
    Console.WriteLine("S = {0}",S);
    string str = "";
    for(int i = 0; i < M.Length; i++)
    {
    str += M[i].ToString() + ",";//values list
    }
    str = str.Substring(0,str.Length - 1); Console.WriteLine("M = {0}",str);
    Console.WriteLine("Reading..."); Hashtable result = new Hashtable(M.Length);//result items as... float flag1 = 0f;

    for(int i = 0; i < M.Length; i++)
    {
    if(M[i] == S)
    {
    result.Add(M[i],0);//equal
    //break;
    }

    for(int j = 0; j < M.Length; j++)
    {
    if(i == j) continue;

    if (M[i] + M[j] == S)
    {
    result.Add(M[i].ToString() + "," + M[j].ToString(),0);//plus equal
    }
    else
    {
    flag1 = S - (M[i] + M[j]);
    result.Add(M[i].ToString() + "," + M[j].ToString(),flag1);
    }
    }
    }
    if(result.Count > 0)
    {
    flag1 = 0;
    ArrayList min = new ArrayList(result.Count);
    float lower = -1,upper = 1;
    string lowerkey = "",upperkey = "";
    bool equal = false;
    //print results
    IDictionaryEnumerator kv = result.GetEnumerator();
    while (kv.MoveNext())
    {
    flag1 = Convert.ToSingle(kv.Value);
    if(flag1 == 0)
    {
    Console.WriteLine("Like Items:{0},Value As {1}",kv.Key,kv.Value);
    equal = true;
    continue;
    }
    if(flag1 < 0)
    {
    if(flag1 > lower)
    {
    lowerkey = kv.Key.ToString();
    lower = flag1;//lower
    }
    }
    else
    {
    if(flag1 < upper) 
    {
    upperkey = kv.Key.ToString();
    upper = flag1;//upper
    }
    } }
    if(equal == true)return; Console.WriteLine("");
    if(lowerkey != "") Console.WriteLine("Like Items:{0},Value As {1}",lowerkey,lower);
    if(upperkey != "") Console.WriteLine("Like Items:{0},Value As {1}",upperkey,upper);// float lower = -1,upper = 1;
    // min.Sort();
    // for(int i = 0; i < min.Count; i++)
    // {
    // flag1 = Convert.ToSingle(min[i]);
    // if(flag1 < 0)
    // {
    // if(flag1 > lower) lower = flag1;//lower
    // }
    // else
    // {
    // if(flag1 < upper) upper = flag1;//upper
    // }
    //
    // }
    }
    }
      

  10.   

    TO: 3tzjq(永不言弃) 
    谢谢您的努力。请问有QQ或MSN吗 我还有一些问题想请教。谢谢~~~我的QQ :82975672。