可以将int n分为1或2的不同方式

时间:2018-09-30 03:31:55

标签: algorithm time time-complexity combinatorics

这是我要分配的问题:

  

患者需要服用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 :(得分:1)

您的示例显示8之后的错误值(应为13 ...)。

考虑下一种方法:在最后一天,患者可以吃一丸或两丸(n = (n-1) + 1n = (n-2) + 2)。因此,构成T(n)值的方法数量是

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

使用T(n-1)和T(n-2)重复相同的过程,您将在T(0)或T(1)处完成-这些值显然等于1。

因此建立循环序列并解决任何n的重复。

请注意,您可以从结束(递归方法)展开递归,并从0/1-迭代方法开始。

当您找到正确的值时,您可能会发现它们构成了著名的序列,并进一步了解了该序列。

答案 1 :(得分:0)

这是解决此问题的另一种方法,当您将其视为置换和组合问题时,这将成为一个非常有趣的问题。

让我们

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

希望有帮助。