Вот еще один способ решить эту проблему. Это становится очень интересной проблемой, когда вы рассматриваете это как проблему перестановок и комбинаций.
Давайте возьмем
n = 6 as a example,
скажем,
d = number of days patient takes to take all n pills
maximum number of days patient can take those pills are 6. (1 for each day).
minimum would be 3. (2 for every day).
when d = 6 => {1,1,1,1,1,1}
so when d = 3 => {2,2,2}
when d = 4 => {1,1,2,2}. patient can take this pills in any order in those 4 days.
so number of combinations are = 4!/2!2! = 4C2.
when d = 5 => {1,1,1,1,2}.
number of combinations = 5!/4!1! = 5C1.
when d = 6 => {1,1,1,1,1,1}.
number of combinations = 6!/6!0! = 6C0.
позволяет вернуться к минимальному количеству дней,
when d = 3 => {2,2,2} => 3!/0!3! => 3C3.
теперь вы можете легко увидеть образец здесь в факториалах,
when d = d => d!/(numberOf1s)!*(numberOf2s)!.
, так что число различныхспособы, которыми пациент может принять все 6 таблеток:
T(6) = 3C3 + 4C2 + 5C1 + 6C0.
T(6) = 1 + 6 + 5 + 1
T(6) = 13;
в соответствии с приведенной выше схемой, вот алгоритм,
d_M - maximum number of days;
d_m - minimum number of days;
T(n) - number of different ways the patient can take all n pills
Вот как вы можете сделать это с помощью простого JavaScript,
function numberOfDiffWays(n){
var dmin = Math.ceil(n/2);
var dmax = n;
var sum = 0;
for(var d= dmin; d<=dmax; d++){
sum = sum + nCr(d,(2*d-dmax));
}
return sum;
}
function nCr(n,r) {
return fact(n) / (fact(r) * fact(n - r));
}
function fact(n) {
return n==0 ? 1: n*fact(n-1);
}
console.log("n=1: " + numberOfDiffWays(1)); // 1
console.log("n=2: " + numberOfDiffWays(2)); // 2
console.log("n=3: " + numberOfDiffWays(3)); // 3
console.log("n=4: " + numberOfDiffWays(4)); // 5
console.log("n=5: " + numberOfDiffWays(5)); // 8
console.log("n=6: " + numberOfDiffWays(6)); // 13
console.log("n=7: " + numberOfDiffWays(7)); // 21
Надеюсь, это поможет.