Другим способом int n можно разбить на группы по 1 или 2 - PullRequest
0 голосов
/ 30 сентября 2018

Это вопрос, заданный мне для выполнения задания:

Пациент должен принять n таблеток.Каждый день он может принимать одну или две таблетки, пока все таблетки не исчезнут.Пусть T (n) обозначает количество различных способов, которыми пациент может принять все n таблеток.Дайте замкнутую форму для T (n).(Обратите внимание, что, например, две последовательности (1, 2, 2) и (2, 1, 2) рассматриваются как два разных способа приема 5 таблеток.) ​​

Я пыталсяобработайте наборы для n = от 1 до 8, чтобы посмотреть, смогу ли я найти такой шаблон:

n = 1 {1} n = 2 {{1,1}, {2}} n= 3 {{1,1,1}, {1,2}, {2,1}} n = 4 {{1,1,1,1}, {1,1,2}, {1,2,1}, {2,1,1}, {2,2}} ...

Но не смогли.Комбинации из n = 1-8: 1,2,3,5,8,12,18,25

У кого-нибудь есть идеи?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Вот еще один способ решить эту проблему. Это становится очень интересной проблемой, когда вы рассматриваете это как проблему перестановок и комбинаций.

Давайте возьмем

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;

enter image description here

d_m - minimum number of days;

enter image description here

T(n) -  number of different ways the patient can take all n pills

enter image description here

Вот как вы можете сделать это с помощью простого 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

Надеюсь, это поможет.

0 голосов
/ 30 сентября 2018

Ваш пример показывает неправильные значения после 8 (должно быть 13 ...).

Рассмотрим следующий подход: в последний день пациент может съесть одну таблетку или две таблетки (n = (n-1) + 1 или * 1004).*)Таким образом, число способов составить значение T (n) составляет

T(n) = T(n-1) + T(n-2)

. Повторите тот же процесс с T (n-1) и T (n-2), и вы закончите в T (0) илиT (1) - эти значения, по-видимому, равны 1.

Так построите рекуррентную последовательность и решите рекуррентность для любого n.

Обратите внимание, что вы можете разматывать повторения с конца (метод рекурсии) и начинать с метода итерации 0/1.

Когда вы найдете правильные значения, вы можете обнаружить, что они образуют известную последовательность, и узнать больше об этом.

...