在组合问题中,我们都知道我们可以2n
方式将2n!
项放在一起。但现在说我有两套物品:
Set A = {a_1, a_2, ...., a_n}, A.length = n
Set B = {b_1, b_2, ...., b_n}, B.length = n
我的问题是:您可以通过多少种方式将这些2n
项放在一起,以保持其相对顺序,例如a_i
a_(i-1)
不能放在b_i
之前,b_(i-1)
不能放在b_i
之前,a_i
可以放在A=〈a_1, a_2, a_3 〉
B=〈b_1, b_2, b_3 〉
之前。
示例:
a_1 a_2 b_1 a_3 b_2 b_3
b_1 a_1 a_2 b_2 b_3 a_3
法律格式:
a_1 b_2 a_2 b_1 a_3 b_3 (b_2 visited before b_1).
非法格式:
$scope.savebutton = function() {
angular.forEach($scope.textboxes, function(text) {
if (text != undefined && text.length != 0) {
inputs = [];
angular.forEach($scope.textboxes, function(t) {
inputs.push(t);
});
}
});
var textfield = {
id: "1",
Name: "textbox"
}
$scope.form = {};
$scope.form.fields = [];
$scope.form.fields.push(textfield);
console.log(angular.toJson($scope.form));
ngDialog.closeAll();
};
答案 0 :(得分:2)
您不是在搜索组合,而是搜索排列,更具体地说是重复排列。为什么?从第一组中选择元素的n
位置后,只有一种方法可以将元素从集合中放入这些位置(因为它们必须按顺序排列)。同样的推理适用于第二组。因此,您的问题等同于此问题:找到长度2n
的二进制字数,n
个零和n
个。这是在任何离散数学课程中学到的东西,答案是(2n)! / (n! * n!)
。
n = 2
的示例:A = {a_1,a_2},B = {b_1,b_2}。可能的排列是:
(a_1,b_1,b_2,a_2),
(a_1,a_2,b_1,b_2),
(a_1,b_1,a_2,b_2),
(b_1,a_1,a_2,b_2),
(b_1,b_1,a_1,1_2),
(b_1,a_1,b_2,a_2)
当然符合公式(4!)/(2!* 2!)= 6.
一个提示:以编程方式为大n
计算此数字时,请注意处理溢出。首先计算分子然后除以分母并不是一个好习惯,因为因为阶乘增长很快所以很有可能出现溢出。
答案 1 :(得分:1)
请注意,这个答案是不正确的,因为您必须使用字符串中两个集合中的所有内容,并且如果您在序列末尾选择数字,则字符串中的数字将会出现顺序您无法自由选择所有剩余的数字。
每当您从任一组中选择一个时,它会将您的选项限制为第二组中右侧的选项,或者选择最后一个选项右侧的选项
您首先从两个选项中选择1t - 2个选项 这使你从你选择的集合中的另一个集合+ n-1中得到n = 2n-1,你可以选择下一个选择。 < - 无法从此套装中选择任何内容。您只能从任一组中选择下一个 然后2n-2为第3,依此类推 2 *(2N-1)的(2N-2)(2N-3).... 1
答案是2 *(2n-1)!
我累了,如果我这么久就很高兴被证明是错的。