zoukankan      html  css  js  c++  java
  • 项链颜色分配问题

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

  • 相关阅读:
    c# 线程同步各类锁
    C#_从DataTable中检索信息
    永无BUG
    标志枚举
    将多行按分隔符"|"合成一行
    回车换行浅析
    url传输编码
    xshell 禁用铃声 提示音
    php 编译安装 mysql.so
    301 302 304
  • 原文地址:https://www.cnblogs.com/laifeiyao/p/3617467.html
Copyright © 2011-2022 走看看