求个计算问题的算法
static class Program
{
[STAThread]
static void Main()
{
Ar(new int[] { 5, 100, 195, 10 }, 200);
}
//先列出递归原理
//static void Ar(int[] ar, int g)
//{
// int size = ar.Length;
// for (int x = 0; x < size; x++)
// {
// for (int y = x + 1; y < size; y++)
// {
// for (int z = y + 1; z < size; z++)
// {
// if (x + y + z == g)
// return true;
// else if (x + y + z > g)//结束
// break;
// //for (int a = z + 1; a < size; a++)
// //...
// }
// }
// }
//}
//开始点
static void Ar(int[] array, int target)
{
//结果
int[] result = new int[array.Length];
if (Ar(array, target, ref result, 0, 0, 0))
{
//成功
Console.Write("成功:");
for (int i = 0; i < result.Length; i++)
{
if (i > 0)
Console.Write("+");
Console.Write(result[i]);
}
Console.Write("=" + target);
Console.WriteLine();
Console.Read();
}
else
{
result = new int[0];
//失败
Console.Write("失败");
Console.Read();
}
}
static bool Ar(int[] array, int target, ref int[] result, int index, int depth, int aggregate)
{
int size = array.Length;
int val;
for (int i = index; i < size; i++)
{
val = array[i] + aggregate;
if (val > target)
break;
else if (val == target)
{
result[depth] = array[i];
Array.Resize(ref result, depth + 1);
return true;
}
result[depth] = array[i];
if (Ar(array, target, ref result, i + 1, depth + 1, val))
return true;
}
return false;
}
}