测验:计算组合天数

我想计算不同types的天数,我可以有我的设定值相等。

例如,如果某人有30天年假作为就业的一部分,我想计算他们可以采取什么不同的假期。

一个例子是:

5,10,5,2,2,1,5

正如你可以看到上面将等于30。

计算的想法是让潜在员工知道他们可以rest几天。

返回的值也可以是:

10,10,10

这意味着我需要计算等于总年假数量的号码组合。

挑战可以用任何编程语言完成!

我已经尝试了以下内容:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { // find all possible combinations of this list var input = new[] { "1", "2", "3", "4", "5", "6","7","8","9","10","11","12","13","14" }; var output = FastPowerSet(input); Print(output); Console.ReadLine(); } static T[][] FastPowerSet<T>(T[] seq) { var powerSet = new T[1 << seq.Length][]; powerSet[0] = new T[0]; // starting only with empty set for (var i = 0; i < seq.Length; i++) { var cur = seq[i]; var count = 1 << i; // doubling list each time for (var j = 0; j < count; j++) { var source = powerSet[j]; var destination = powerSet[count + j] = new T[source.Length + 1]; for (var q = 0; q < source.Length; q++) destination[q] = source[q]; destination[source.Length] = cur; } } return powerSet; } static void Print<T>(T[][] seq) { for (var i = 0; i < seq.Length; i++) { var line = new StringBuilder(); for (var j = 0; j < seq[i].Length; j++) { line.AppendFormat("{0}, ", seq[i][j]); } Console.WriteLine(line); } } } } 

谢谢PriceCheaperton!

这里已经回答了一个比较宽泛的问题,即给定的总和的部分大小的限制也可以给出。

在上面链接的Python解决scheme中,您将修改对此函数的调用来解决您的特定示例(我不知道15..30是否有效,否则您需要按照相同的方式完成列表已经开始了):

 subset_sum([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15..30],30) 

最好的问候,垫子

以下逻辑应该可以解决你的问题:

 calculate(n) { if(n == 2) return 2; if(n == 1) return 1; sum = 0; for(int i = 1; i < n/2, i++){ sum += calculate(i) + calculate(ni); } return sum; } 

我已经尝试了一个在Python中做事的recursion方式,正常工作:

 def combination(n): if n == 0: return [[]] comb = [] for i in xrange(n): sub_comb = combination(n-(i+1)) for l in sub_comb: l.append(i+1) comb.append(l) return comb if __name__ == '__main__': print combination(10)