Tag: 组合学

X的每个可能组合分成N个堆栈

我确信这个问题有一个正式的名称,并且知道这个名字可能会帮助我找到解决方案,但我不知道,并且谷歌的问题一直指向我背包问题 ,这是不一样的事情。 我想取一些值X并找到将该值拆分为N个整数整数的可能组合。 如果我的措辞令人困惑,这里是X = 4,N = 3的例子 Stack -> 1 | 2 | 3 | ———————- #1—–> 4 | 0 | 0 | ———————- #2—–> 3 | 1 | 0 | ———————- #3—–> 2 | 1 | 1 | ———————- #4—–> 2 | 2 | 0 | 复制是可以接受的,因为它很容易删除,但理想情况下不会计算。 解决问题的算法将是完美的,但即使找出问题的名称也会使研究更容易。 谢谢。

在尊重偏好的同时将人分配到建筑物?

一位朋友今天问了我一个关于转让问题的问题。 我找到了一个非常简单的解决方案,但我觉得它可以变得更简单,更快捷。 非常感谢您的帮助。 问题:假设我有N个人,我需要将它们分配到M个建筑物中,每个建筑物都可以容纳K个人。 并非所有人都愿意相互生活,所以我有一个N * N细胞矩阵和一个标志着愿意相互生活的人的1。 如果一个单元格包含1,则意味着我和J可以共存。 显然,矩阵在主对角线周围是对称的。 我的解决方案如下(伪代码): int[] Match(int[] people, int[][] pairs, int numBuildings, int buildingsSize) { int[] freePeople = findFreePeople(people); if(freePeople) = 0 { return people; } foreach(int person in freePeople) { for(int buildingIndex=0 to numBuildings) { if( CheckIfPersonFitsInBuilding(…) ) { int[] tempPeople = people.Copy(); tempPeople[person] = buildingIndex; int[] result = […]

列出1 … n之间k个整数的所有可能组合(n选择k)

出于没有特别的原因,我决定寻找一种算法,该算法产生1 … n之间k个整数的所有可能选择,其中k整数之间的顺序无关紧要(n选择k thingy)。 从完全相同的原因,这完全没有理由,我也用C#实现了它。 我的问题是: 你在我的算法或代码中看到任何错误吗? 而且,更重要的是, 你能建议一个更好的算法吗? 请注意算法而不是代码本身。 这不是我写过的最漂亮的代码,虽然可以告诉你是否看到了错误。 编辑: Alogirthm解释 – 我们持有k指数。 这会创建k个嵌套for循环,其中循环i的索引是indices [i]。 它模拟k for for循环,其中indices [i + 1]属于嵌套在indices [i]循环中的循环。 indices [i]从索引[i-1] + 1到n-k + i + 1运行。 码: public class AllPossibleCombination { int n, k; int[] indices; List combinations = null; public AllPossibleCombination(int n_, int k_) { if (n_ <= […]

计算二项式系数的算法

我需要一种计算组合的方法,而不会耗尽内存。 这是我到目前为止所拥有的。 public static long combination(long n, long k) // nCk { return (divideFactorials(factorial(n), ((factorial(k) * factorial((n – k)))))); } public static long factorial(long n) { long result; if (n <= 1) return 1; result = factorial(n – 1) * n; return result; } public static long divideFactorials(long numerator, long denominator) { return factorial(Math.Abs((numerator – […]