这是我要分配的问题:
患者需要服用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
有人有主意吗?
答案 0 :(得分:1)
您的示例显示8之后的错误值(应为13 ...)。
考虑下一种方法:在最后一天,患者可以吃一丸或两丸(n = (n-1) + 1
或n = (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;
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
希望有帮助。