C# - 组合学

标签 c# asp.net combinatorics

我有一个大约 300 个对象的列表,它们都有价格和分数。我需要找到总价小于 X 的 15 个对象的最佳组合(即最高总分)。

在我看来,最直接的方法是嵌套 15 个 for 循环并检查每个可能的组合,但这需要几天的时间。

在 C# 中是否有任何“干净”的方法来执行此操作?

谢谢!

最佳答案

没有示例很难提供帮助,但如果我理解了问题,那么这可能会有所帮助。

假设你的对象看起来像这样

public class Item
{
        public int Score { get; set; }
        public decimal Price { get; set; }
}

那么下面的内容应该可以解决您的问题。

var listOfObjects = new List<Item>();

var topItems = listOfObjects.Where(p => p.Price < 100).OrderByDescending(p => p.Score).Take(15);

编辑:在披露所有细节后,以下内容应该有所帮助

免责声明:快速而肮脏的解决方案(次优)

创建一个新类

public class ItemWithRunningTotal
{
    public Item Item { get; set; }
    public decimal RunningTotal { get; set; }
}

那么以下内容应该可以满足您的需求。

var maxTotal = 1500; //for you 8000
        var objects = new List<Item>()
                      {
                          new Item() {Score = 10, Price = 100},
                          new Item() {Score = 20, Price = 800},
                          new Item() {Score = 40, Price = 600},
                          new Item() {Score = 5, Price = 300},
                      };

        decimal runningTotal = 0;
        var newList = objects
            .OrderByDescending(p => p.Score)
            .Select(p =>
                    {
                        runningTotal = runningTotal + p.Price;
                        return new ItemWithRunningTotal()
                               {
                                   Item = p,
                                   RunningTotal = runningTotal
                               };
                    })
            .OrderByDescending(p => p.RunningTotal)
            .Where(p => p.RunningTotal <= maxTotal).Take(15);

关于C# - 组合学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36235224/

相关文章:

java - 为什么这段代码在 Java 中比在 C++ 和 C# 中更快

c# - 向网站发送新的数据库记录

c++ - 基于初始输入生成所有组合(n 选择 k)的快速算法

r - R 中的简单组合

c# - 从代码 View 查看设计器中的组件

C# 从命令行加载文件?

c# - 在 C# CodeBehind 中为 javascript 变量赋值

javascript - 从 JavaScript 函数获取值到我的 ASP.NET/C# 代码隐藏

algorithm - 计算正碳脂肪族烷烃的异构体

c# - 为什么锁确保底层监视器被释放而直接使用监视器却没有?