项链颜色分配问题
[问题]M个交易员在圆桌旁围坐一圈,将N(N < M)个交易品种分配给他们研究。每人分配一个,要求相邻的两个人所分配到的交易品种不相同。编程计算共有多少种分配方式
[解析]将圆桌抽象成一个圆,将交易员抽象成圆上的一个个小球(类似于项链),将分配M个交易品种抽象成分配M种颜色。从任意一个球开始,将其编号为1。对于1号球,有M种颜色分配方案。设n个球中的第1个球的颜色设定后,还有F(n)种颜色分配方案,则颜色分配方案的总数为M * F(N).
下面来求F(N)。从1号球开始选定3个球,分别编号为1、2、3.下面分两种情况讨论:
(1)如果3号球与1号球颜色相同,则1、2、3这3个球共有M-1种颜色分配方案。此时对于剩下的球,可以将1、2两球去掉,只保留3号球。这样就有F(N-2)颜色分配方案。所以第一种情况下颜色分配方案的总数为(M-1) * F(N-2)
(2)如果3号球与1号球颜色不同,则1、2、3这3个球共有(M-1) * (M-2)种颜色分配方案。此时对于剩下的球,可以将2号球去掉,只保留1、3两球。设n个球中的前两个球的颜色设定后,还有f(n)种颜色分配方案,这样就有f(N-1)颜色分配方案。所以第二种情况下颜色分配方案的总数为(M-1) * (M-2) * f(N-1)
下面来求f(N)。将最开始的3个球编号为1、2、3,仍然分两种情况来讨论。
a.如果3号球与1号球颜色相同,则1、2、3这3个球共有1种颜色分配方案。此时对于剩下的球,可以将1、2两球去掉,只保留3号球。这样就有F(N-2)颜色分配方案。所以第一种情况下颜色分配方案的总数为 F(N-2)
b.如果3号球与1号球颜色不同,则1、2、3这3个球共有(M-2)种颜色分配方案。此时对于剩下的球,可以将2号球去掉,只保留1、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