找到最接近目标数字的数字组合

时间:2016-04-04 03:51:30

标签: c# list

我有一个列表List<MyClass>MyClass包含一个整数值cost

给定目标编号,我如何确定元素组合,使其总成本尽可能接近目标而不超过目标。

2 个答案:

答案 0 :(得分:0)

这是knapsack problem的一个特例,其中权重和值是相同的。如果你的目标不是太大,那么基于动态规划的经典解决方案,复杂度为O(n * t)(n是值的数量,t是目标)应该没问题。 在网上找到任何语言的实现都不难。

答案 1 :(得分:0)

这对我有用:

Func<IEnumerable<MyClass>, IEnumerable<IEnumerable<MyClass>>> getAllSubsets = null;
getAllSubsets = xs =>
    (xs == null || !xs.Any())
        ? Enumerable.Empty<IEnumerable<MyClass>>()
        :  xs.Skip(1).Any()
            ? getAllSubsets(xs.Skip(1))
                .SelectMany(ys => new [] { ys, xs.Take(1).Concat(ys) })
            : new [] { Enumerable.Empty<MyClass>(), xs.Take(1) };

Random rnd = new Random();              
MyClass[] array = Enumerable.Range(0, 10).Select(x => new MyClass() { cost = rnd.Next(5, 100) }).ToArray();

var result =
    getAllSubsets(array)
        .Select(x => new
        {
            MyClass = x,
            TotalCost = x.Sum(y => y.cost),
        })
        .Where(x => x.TotalCost <= 50)
        .OrderByDescending(x => x.TotalCost)
        .FirstOrDefault();

此代码的一次运行给了我:

result