我正在尝试编写一种算法来计算结果。但我需要有关组合学的帮助。
假设我必须从1到10中选择2个数字。 根据计算的基本规则,在没有任何限制的情况下,可能结果的数量为10 * 10 = 100.(选择第一个数字时可能有10个结果,选择第二个数字可能有10个结果)。
鉴于第一个数字必须大于第二个数字,可能的结果数是多少?
答案 0 :(得分:11)
45
想象一下你的10x10对网格。存在从1,1到10,10的对角线,其中A = B,因此那些不是A> B.该线将其他情况分成两半:一个具有A> B,一个具有B< A.这些分区中的每一个都是相同的大小。剩下90个值(对角线10个值),因此有45对,其中A> 1。乙
答案 1 :(得分:6)
如果您选择:
所以
9 + 8 + ... + 2 + 1 = 45
这称为arithmetic progression总和等于:
f(n) = n * (n+1) / 2 = 9 * 10 / 2 = 45
答案 2 :(得分:0)
我会说
f(n) = n * (n-1) / 2
其中n等于需要组合的不同数字的数量。 因此,对于n = 10,它将是:
10 * (10-1) / 2 = 45
答案 3 :(得分:0)
您的问题属于二项式系数。要计算每次采取2个项目的10个项目的唯一组合的总数,公式N! /(K!(N-K)!)可以使用。插入10表示N,2表示K表示45。
我编写了一个类来处理使用二项式系数的常用函数,这是这个问题的类型。它执行以下任务:
以任意N选择K到文件的格式输出所有K索引。 K索引可以用更具描述性的字符串或字母代替。这种方法使解决这类问题变得非常简单。
将K索引转换为已排序二项系数表中条目的正确索引。这种技术比依赖迭代的旧发布技术快得多。它通过使用Pascal三角形中固有的数学属性来实现。我的论文谈到了这一点。我相信我是第一个发现和发布这种技术的人,但我可能错了。
将已排序的二项系数表中的索引转换为相应的K索引。
使用Mark Dominus方法计算二项式系数,这样就不太可能溢出并使用更大的数字。
该类是用.NET C#编写的,它提供了一种通过使用通用列表来管理与问题相关的对象(如果有)的方法。此类的构造函数采用名为InitTable的bool值,当为true时,将创建一个通用列表来保存要管理的对象。如果此值为false,则不会创建表。不需要创建表来执行上述4种方法。提供访问者方法来访问该表。
有一个关联的测试类,它显示了如何使用该类及其方法。它已经过2个案例的广泛测试,并且没有已知的错误。
要阅读此课程并下载代码,请参阅Tablizing The Binomial Coeffieicent。
将此类转换为C ++应该不难。