110,567
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var list = new List<int> { 10, 8, 7, 7, 15, 13, 6, 6, 3, 3, 3, 4, 8, 9, 10, 13, 14 };
var cnt = 0;
foreach (var r in 组合(list, 50, 0).Take(20))
{
Console.Write("第{0}个组合:", ++cnt);
foreach (var s in r)
Console.Write("{0} ", s);
Console.WriteLine(" {0}次", r.Count());
}
Console.WriteLine("...................按任意键结束");
Console.ReadKey();
}
static IEnumerable<IEnumerable<int>> 组合(List<int> arr, int goal, int index)
{
for (var i = index; i < arr.Count; ++i)
{
if (arr[i] == goal)
yield return new int[] { arr[i] };
else if (arr[i] < goal)
{
foreach (var x in 组合(arr, goal - arr[i], i + 1))
yield return new int[] { arr[i] }.Concat(x);
}
}
}
}
}
static void Main(string[] args)
{
int[] a = { 10, 8, 7, 7, 15, 13, 6, 6, 3, 3, 3, 4, 8, 9, 10, 13, 14 };
var sum = 50;
var res = new List<N>(); //结果缓冲区
for (var i = 0; i < a.Length; i++) res.Add(new N(i, a[i]));//初始化结果缓冲区
for (var i = 0; i < res.Count; i++)
{
var c = sum.CompareTo(res[i].v.Sum());
switch (c)
{
case 0: //达到目标
//res.Add(res[i]);
//tmp.RemoveAt(i--);
break;
case -1://大于目标就删去
res.RemoveAt(i--);
break;
default: //否则补充后续项
var k = i + 1;
for (var j = res[i].i+1; j < a.Length; j++)
{
var n = new N(j, res[i].v);
n.v.Add(a[j]);
//res.Add(n);//追加到尾部,不能保证顺序
res.Insert(k++, n);//插入到当前项后面
}
res.RemoveAt(i--);//删去当前项,因为不合要求
break;
}
}
Console.WriteLine("共找到 {0} 种组合", res.Count);
Console.WriteLine("前 20 种为:", res.Count);
foreach (var n in res.Take(20))
{
Console.WriteLine("{0} = {1}", n.v.Sum(), string.Join("+", n.v));
}
}
class N
{
public int i;
public List<int> v;
public N(int i, List<int> v)
{
this.i = i;
this.v = new List<int>(v);
}
public N(int i,int v)
{
this.i=i;
this.v = new List<int>(){v};
}
}
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var list = new List<int> { 10, 8, 7, 7, 15, 13, 6, 6, 3, 3, 3, 4, 8, 9, 10, 13, 14 };
var cnt = 0;
var container=new List<IEnumerable<int>>();
foreach (var r in 组合(list, 50).Take(20))
{
Console.Write("第{0}个组合:", ++cnt);
foreach (var s in r)
Console.Write("{0} ", s);
Console.WriteLine(" {0}次", r.Count());
}
Console.WriteLine("...................按任意键结束");
Console.ReadKey();
}
static IEnumerable<IEnumerable<int>> 组合(List<int> arr, int goal)
{
for (var i = 0; i < arr.Count; ++i)
{
if (arr[i] == goal)
yield return new int[] { arr[i] };
else if (arr[i] < goal)
{
var arr1 = arr.ToList();
arr1.RemoveAt(i);
foreach (var x in 组合(arr1, goal - arr[i]))
yield return new int[] { arr[i] }.Concat(x);
}
}
}
}
}