编辑:n是人数。K是被淘汰的kth人员。因此,对于k=2,每2个人就会被淘汰。
int josephus(int n, int k)
{
if (n == 1)
return 1;
else
return (josephus(n - 1, k) + k-1) % n + 1;
}代码尽可能简单。但不知何故,我无法理解这个问题(老实说,这有点让人难堪)。
我想要理解的是,
主要问题是,如果我们知道约瑟夫斯(n-1,k)的正确解,我们如何计算约瑟夫斯(n,k)的解。我们已经有效地增加了一个人的人口,并以某种方式增加这个k-1值给了我正确的解决方案(让我们暂时忽略mod )。
有人能向我解释这一点吗?在问题的每一步,最优的子结构属性是如何保持的?
发布于 2021-08-18 20:12:38
我们需要调整k-1的位置,因为在kth被移除后,开始位置已经被k移动(第一个k-1被旋转到末端)。也就是说,初始位置pos变成pos。如果k= 3,(n-1,k)返回pos = 2,则原始位置应为pos +k= 5。
我们在公式中用k-1代替k,因为我们必须用mod(n):k= (k-1) %n+1。
https://stackoverflow.com/questions/31775604
复制相似问题