题目描述
题目链接:年会抽奖
思路方法
排错算法、递归
具体分析
这是一个不放回的排列组合问题。当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推。
第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
第二步,放编号为k的元素,这时有两种情况:把它放到位置n,那么,对于剩下的n-1个元素,
由于第k个元素放到了位置n,剩下n-2个元素就有D(n-2)种方法;
第k个元素不把它放到位置n,这时,对于这n-1个元素,有D(n-1)种方法;
综上得到递推公式,可以发现可以用递归来做;
D(n) = (n-1) [D(n-2) + D(n-1)]
特殊地,D(1) = 0, D(2) = 1.
解释:
假设a的名字没有被a拿到,其他 n-1 个人都有可能拿到,即有n - 1种情况。假设b拿到了a的名字,那么对于b的名字有两种情况:
第一种是b的名字被a拿到了,也就是a、b互相拿到了对方的名字,那么对于其他n - 2个人互相拿错又是一个子问题count(n - 2)
第二种是b的名字没有被a拿到,则剩下的问题是子问题count(n-1)
程序测试
import java.util.Scanner;
public