111,125
社区成员
发帖
与我相关
我的任务
分享

public class Program
{
static Dictionary<int, List<int>> testResults = new Dictionary<int, List<int>>();
static List<List<int>> results = new List<List<int>>();
private static int[] test;
private static int index;
private static int sum;
private static int inaccuracy;
public static void Main(string[] args)
{
test = new int[] { 12, 60, 8, 99, 15, 35, 17, 18 };
sum = 35;
inaccuracy = 0;
Calc(test);
foreach (var item in results)
{
foreach (var num in item)
{
Console.WriteLine(num+",");
}
Console.WriteLine(" ");
}
Console.ReadLine();
}
public static void Calc(int [] paras)
{
for (int i = 0; i < paras.Length; i++)
{
if (paras[i] >= sum - inaccuracy && paras[i] <= sum + inaccuracy)
results.Add(new List<int>() { paras[i] });
for (int j = i + 1; j < paras.Length; j++)
{
index = j + 1;
Calc(null, paras[i], paras[j]);
index = 0;
testResults.Clear();
}
}
}
public static void Calc(int? num,int num1,int num2)
{
if (num1 > sum + inaccuracy || num2 > sum + inaccuracy) return;
if (num == null)
{
if (num1 + num2 < sum - inaccuracy)
{
testResults.Add(num1 + num2, new List<int>() { num1, num2 });
if (++index < test.Length)
Calc(num1 + num2, num1 + num2, test[index]);
}
else if (num1 + num2 >= sum - inaccuracy && num1 + num2 <= sum + inaccuracy)
results.Add(new List<int> { num1, num2 });
}
else
{
List<int> current = testResults[num.Value];
int count = 0;
foreach (var item in current)
{
count += item;
}
if (count + num2 < sum - inaccuracy)
{
testResults[num.Value].Add(num2);
if (++index < test.Length)
Calc(num.Value, count + num2, test[index]);
}
else if (count + num2 >= sum - inaccuracy && count + num2 <= sum + inaccuracy)
{
testResults[num.Value].Add(num2);
results.Add(testResults[num.Value]);
}
}
}
}
private static readonly int[] values = { 12, 60, 8, 99, 15, 35, 17, 18 };
private const int total = 35;
private static void GetString(Dictionary<string, int> dd)
{
Dictionary<string, int> dic = new Dictionary<string, int>();
foreach (KeyValuePair<string, int> kv in dd)
{
for (int i = kv.Value + 1; i < values.Length; i++)
{
string calc = kv.Key + "+" + values[i];
if (Convert.ToInt32(new DataTable().Compute(calc, null)) == total)
{
Console.WriteLine(calc);
}
dic.Add(kv.Key + "+" + values[i], i);
}
}
if (dic.Count > 0)
{
GetString(dic);
}
}
public static void Main()
{
Array.ForEach(Array.FindAll(values, x => x == total), Console.WriteLine);
Dictionary<string, int> dic = new Dictionary<string, int>();
for (int i = 0; i < values.Length; i++)
{
dic.Add(values[i].ToString(), i);
}
GetString(dic);
Console.ReadLine();
}
static void Main(string[] args)
{
int[] values = { 12, 60, 8, 99, 15, 35, 17, 18 };
var testdata = values.Select((n, i) => new { id = i + 1, total = n }).ToArray();
var total = 35;
Func<IEnumerable<int[]>, int[], IEnumerable<int[]>> comb = (x, y) =>
from a in x
from b in y
where a.Count() == 0 || a.Last() < b
select a.Concat(new[] { b }).ToArray();
var indices = Enumerable.Range(0, testdata.Length).ToArray();
var list = new int[][] { new int[] { } }.AsEnumerable();
var result = Enumerable.Range(1, testdata.Length)
.SelectMany(i => list = comb(list, indices))
.Where(c => c.Sum(i => testdata[i].total) == total)
.Select(c => c.Select(i => testdata[i]));
foreach (var c in result)
Console.WriteLine("({0})\t {1} = {2}",
string.Join(", ", c.Select(d => d.id)),
string.Join(" + ", c.Select(d => d.total)),
total);
Console.Read();}