项链颜色分配问题

[问题]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

 

posted @ 2014-03-22 13:35  姚来飞  阅读(342)  评论(0编辑  收藏  举报