急!!!一个关于取数的算法问题向各位高手求助~~~~ 在M个值大于5的单精度数中取N个数,求之和最接近与S(S>100)的这N个数的组合。(例如:有M{110.5,99.5,111.5},S=210则得N{110.5,99.5})(最好给出详细代码 C#) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以参考下面这个贴子:http://community.csdn.net/Expert/topic/3655/3655455.xml 哦,比较复杂的算法......DING... 比如说有1 1 8 6 9 7 25 这几个数 求n个数相加后他们的和S与12最接近的数的组合 比如说{1 1 9}他们的和S=11与12最接近。 我的理解:n应该指1 1 8 6 .....nM = 1 + 1 + 8 + 6 + 9 + 7 + 25 + ......nS = 1 + 1 + 8 + 6 + 9 + 7 + 25 = 57但已知数12来自哪里?它的取值依据是什么? S是给定的 M是指一共有那么多个数 N是指从总数M中取出的数的个数 而这N个数组成的集合 就是所用求的。这个集合中的所有数想加得到的和与给定的S最接近~`~~ 奇怪了!它的共和不是始终和 S 最接吗?因为 它们已经相加了啊:float[] M = new float[]{1,1 8,6,9,7,25};//相加 = 57float 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])相近啊! 如果按 Geranium(魂归阿寒)的理解,那么1 1 8 6 9 7 25 相加后他们的和S与12最接近的数的组合 就不只是 “{1 1 9}他们的和S=11与12最接近”了,而有“{6,7} = 13 ”我想想... 是的,不过因为是float类型,相加后相同的组合应该不容易出现。关键是怎么求最接近S的那一个组合期待楼上的~ 已实现功能要求,你可以做一些改善。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// }//// } }} TO: 3tzjq(永不言弃) 谢谢您的努力。请问有QQ或MSN吗 我还有一些问题想请教。谢谢~~~我的QQ :82975672。 【算法问题】关于找零钱的算法! 高分:求c/s webservice三层架构特定需求的解决办法 关于线程问题 c#怎么画坐标图? 一个2维数组中的一列想保存一个函数的返回如何写? 高手帮帮忙啊,急,急,急啊! SqlDataAdapter.update .net1.1下可以 .net2不行,为什么?困惑 图片上传问题 关于接口的疑问 c#应用程序路径的问题! 如何利用office开发接口在.NET中实现excel文件的打印? 紧急求救一个最好的自动增加序号的方法
http://community.csdn.net/Expert/topic/3655/3655455.xml
M = 1 + 1 + 8 + 6 + 9 + 7 + 25 + ......n
S = 1 + 1 + 8 + 6 + 9 + 7 + 25 = 57但已知数12来自哪里?它的取值依据是什么?
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])相近啊!
关键是怎么求最接近S的那一个组合
期待楼上的~
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
// }
//
// }
}
}
谢谢您的努力。请问有QQ或MSN吗 我还有一些问题想请教。谢谢~~~我的QQ :82975672。