在编程猫的生物研究所里面,研究员正在对一种分裂能力很强的细胞进行药物试验,这种细胞里面有一种物质R,这种物质在细胞里面是一份一份存在的,数量越多,则细胞的体积越大。
已知该细胞在受到药物刺激后,会往它的右边生产一个新的细胞,新细胞内R物质的数量不会超过原细胞的三分之二,新细胞会紧紧附着在原细胞的右边,组成一个细胞团(两个及以上细胞附着在一起,称之为细胞团)。每个细胞只能生产一次,生产后原细胞无任何变化。新细胞在药物刺激下会继续生产新细胞,当细胞内的R物质少于3份时,则不会生产新细胞。
编程猫取来一个该细胞,里面的R物质含量为n,对其一直施加药物刺激,请你帮编程猫分析一下,整个过程最终可能会出现多少种不同的细胞团。
#include <iostream>
using namespace std;
int count(int r) {
if (r < 3) {
// 物质少于3份,则不会生产新细胞
return 1; // 只有原细胞自身
}
int total = 1; // 统计当前细胞团的总数
for (int i = 1; i <= r * 2 / 3; i++) {
// 计算新细胞可能含有的R物质数量
int c = count(r - i); // 递归计算新细胞可能出现的细胞团数量
total += c; // 加上新细胞产生的细胞团数量(包括新细胞自身)
}
return total;
}
int main() {
int n;
cin >> n;
int result = count(n);
cout << result << endl;
return 0;
}