[问题]M个交易员在圆桌旁围坐一圈,将N(N < M)个交易品种分配给他们研究。每人分配一个,要求相邻的两我的所分配到的交易品种不相同。编程计算共有多少种分配方式编程
[解析]将圆桌抽象成一个圆,将交易员抽象成圆上的一个个小球(相似于项链),将分配M个交易品种抽象成分配M种颜色。从任意一个球开始,将其编号为1。对于1号球,有M种颜色分配方案。设n个球中的第1个球的颜色设定后,还有F(n)种颜色分配方案,则颜色分配方案的总数为M * F(N).递归
下面来求F(N)。从1号球开始选定3个球,分别编号为一、二、3.下面分两种状况讨论:动态规划
(1)若是3号球与1号球颜色相同,则一、二、3这3个球共有M-1种颜色分配方案。此时对于剩下的球,能够将一、2两球去掉,只保留3号球。这样就有F(N-2)颜色分配方案。因此第一种状况下颜色分配方案的总数为(M-1) * F(N-2)颜色
(2)若是3号球与1号球颜色不一样,则一、二、3这3个球共有(M-1) * (M-2)种颜色分配方案。此时对于剩下的球,能够将2号球去掉,只保留一、3两球。设n个球中的前两个球的颜色设定后,还有f(n)种颜色分配方案,这样就有f(N-1)颜色分配方案。因此第二种状况下颜色分配方案的总数为(M-1) * (M-2) * f(N-1)
下面来求f(N)。将最开始的3个球编号为一、二、3,仍然分两种状况来讨论。
a.若是3号球与1号球颜色相同,则一、二、3这3个球共有1种颜色分配方案。此时对于剩下的球,能够将一、2两球去掉,只保留3号球。这样就有F(N-2)颜色分配方案。因此第一种状况下颜色分配方案的总数为 F(N-2)
b.若是3号球与1号球颜色不一样,则一、二、3这3个球共有(M-2)种颜色分配方案。此时对于剩下的球,能够将2号球去掉,只保留一、3两球。这样就有f(N-1)颜色分配方案。因此第二种状况下颜色分配方案的总数为(M-2) * f(N-1)
综上所述,递推式以下:
F(N) = (M-1) * F(N-2) + (M-1) * (M-2)* f(N-1)
f(N) = F(N-2) + (M-2)* f(N-1)
得出递推式以后,便可用递归或者动态规划来编程实现。递归截止条件为:
F(1) = 1
F(2) = M - 1
f(2) = 1