algorithm - 获得所有组合的最有效方法是什么?

标签 algorithm

<分区>

Possible Duplicate:
Finding all possible combinations of numbers to reach a given sum

问题

您有一个人员列表作为输入,每个人都有一定数量的学分。您将获得必须通过使用一个或多个人的学分来实现的总数。该函数应输出将导致总数的所有存在的组合。

例如见下:-

static void Main(string[] args)
{
    int total = Convert.ToInt32(args[0]);
    var persons = new List<Person>();
    persons.Add(new Person { Credits = 10, Name="Steve"});
    persons.Add(new Person { Credits = 5, Name = "Paul" });
    persons.Add(new Person { Credits = 4, Name = "David" });
    persons.Add(new Person { Credits = 1, Name = "Kenneth" });

    PrintAllCombinations(persons, total); // The function in question
}
public class Person
{
    public string Name { get; set; }
    public int Credits { get; set; }
}

在上面的示例中,给定总数 10,PrintAllCombinations 函数应输出类似于:-

  • 组合 1) Steve:10
  • 组合 2) Paul:5,David 4,Kenneth 1
  • 组合 3)史蒂夫:9,保罗 1
  • 组合 4) 史蒂夫:5,保罗 5
  • ...等等

更新:我忘了说,你可以使用一个人信用的任何部分

我使用的示例是简化的,但实际场景将限制为不超过 100 人,并且总人数将始终少于 90。

什么是最好的解决方案?

最佳答案

您可以在 Python 中阅读这个普遍存在问题的解决方案, JavaHaskell这里

Finding all possible combinations of numbers to reach a given sum


根据您指定您可能获得部分学分的编辑,您还应该查看这篇文章:

generate a list of combinations/sets of numbers with limited supplies

My solution ,用 C 编写,同样适用于您的情况。

关于algorithm - 获得所有组合的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6780682/

相关文章:

c# - 如何在遵守某些约束的同时生成数字序列?

javascript - 使用angular js检查井字游戏中是否获胜者的逻辑

c - 后缀数组构造 O(N LogN) - 竞争性编程 3 Steven Halim

c# - 检查日期是否在跨度重复之间的最有效方法是什么?

控制加速度直到到达某个位置的算法

algorithm - O(N+m) 和 O(NM) 之间的复杂度计算差异

javascript - 是否有一种算法可以检测我与多边形的哪一侧发生碰撞?

algorithm - 矩阵乘法的时间复杂度

java - MR 实现在 Hadoop 集群中不起作用

algorithm - 一组数字的百分比