我希望找到7个字母集中以下6个字母的所有可能排列。 [a,b,c,d,e,f]
。
问题是每个字母对应一定百分比。每个7个字母集的总百分比需要为100%
答:0% <= a < 1%
1% <= b <= 5%
C:
5% < c <= 25%
D:
25% < d <= 50%
E:
50% < e <= 75%
F:
75% < f <= 100%
例如,这些是可能的集合:
[a,a,a,a,a,a,f]
:所有A都可以是0%而F可以是100%[d,d,b,a,a,a,a]
:D各占47%。 B可以是5%,A可以弥补剩余的1%。但这些是不可能的:[f,a,a,a,a,a,f]
或[e,e,e,a,a,a,a]
,因为他们的总数超过100%。
我一直试图用javascript做这件事,但是没有多少运气。我能够使用这个小提琴生成所有可能的排列:https://jsfiddle.net/v4s6xk5x/。不幸的是,这并没有考虑百分比。
我真的只想要排列而不需要代码。但是任何语言的代码都会有所帮助,这样我才能理解发生了什么。
如果您需要更多信息,请与我们联系。
答案 0 :(得分:2)
递归解决方案的示例:
作为输入,你有:
size: 7
letters: [a,b,c,d,e,f]
minval: [0,1,5,25,50,75]
maxval: [1,5,25,50,75,100]
首先制作一个空集以及此集的最小值和最大值:
set: []
min: 0
max: 0
然后将此集传递给递归函数,该函数应该:
这适用于任何大小,任意数量的字母以及任何最小值和最大值,无论它们是否有序。
这会产生重复,例如:
[a,a,a,a,a,a,f]
[a,a,a,a,a,f,a]
[a,a,a,a,f,a,a]
...
如果您只想生成唯一的解决方案,请开始迭代上一个字母中添加到集合中的字母。
这是一个代码示例。它是上面列出的步骤的字面翻译,增加的特性是它只通过将先前添加的字母的索引传递给递归(变量prev
)来生成唯一的解决方案,然后从那里开始迭代写到最后。如果您需要非唯一解决方案,请每次从0开始迭代。
检查最小值是< 100
而不是<= 100
,确保所有范围都排除低阈值并包含高阈值。
请注意,addLetter()
作为参数接收的所有变量或var
内的addLetter()
声明的变量都是局部变量,并且每个递归都是分开的。
function rangeSet(size, letters, minval, maxval) {
addLetter([], 0, 0, 0);
function addLetter(set, min, max, prev) {
for (var lt = prev; lt < letters.length; lt++) {
if (min + minval[lt] < 100) {
var set_copy = set.concat([letters[lt]]);
var min_copy = min + minval[lt];
var max_copy = max + maxval[lt];
if (set_copy.length == size) {
if (max_copy >= 100) {
document.write(set_copy + "<br>");
}
}
else addLetter(set_copy, min_copy, max_copy, lt);
}
}
}
}
rangeSet(7, ['a','b','c','d','e','f'], [0,1,5,25,50,75], [1,5,25,50,75,100]);
&#13;