我有一个列表List<MyClass>
,MyClass
包含一个整数值cost
。
给定目标编号,我如何确定元素组合,使其总成本尽可能接近目标而不超过目标。
答案 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();
此代码的一次运行给了我: