免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1096 | 回复: 0
打印 上一主题 下一主题

[分享]计算组合的代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-15 16:42 |只看该作者 |倒序浏览
前几天因为业务需要,写了一段计算排列组合的代码,今天整理了一下,拿出来和大家分享,还请大家多多指教


  1. <?php
  2. /**
  3. * 要解决的数学问题:
  4. *       算出C(a,1) * C(b, 1) * ... * C(n, 1)的组合情况,
  5. *       其中C(n, 1)代表从n个元素里任意取一个元素
  6. *
  7. * 要解决的实际问题样例:
  8. *       某年级有m个班级,每个班的人数不同,
  9. *        现在要从每个班里抽选一个人组成一个小组,
  10. *        由该小组来代表该年级参加学校的某次活动。
  11. *        请给出所有可能的组合
  12. */

  13. /* ###### 开始计算 ####### */

  14. /**
  15. * 需要进行排列组合的数组
  16. *
  17. * 数组说明:
  18. *       该数组是一个二维数组,
  19. *       第一维索引代表班级编号,第二维索引代表学生编号
  20. */
  21. $CombinList = array(1 =>; array("Student10", "Student11"),
  22.                     2 =>; array("Student20", "Student21", "Student22"),
  23.                     3 =>; array("Student30"),
  24.                     4 =>; array("Student40", "Student41", "Student42", "Student43"));

  25. /* 计算C(a,1) * C(b, 1) * ... * C(n, 1)的值 */
  26. $CombineCount = 1;
  27. foreach($CombinList as $Key =>; $Value)
  28. {
  29.     $CombineCount *= count($Value);
  30. }

  31. $RepeatTime = $CombineCount;
  32. foreach($CombinList as $ClassNo =>; $StudentList)
  33. {
  34.     // $StudentList中的元素在拆分成组合后纵向出现的最大重复次数
  35.     $RepeatTime = $RepeatTime / count($StudentList);

  36.     $StartPosition = 1;

  37.     // 开始对每个班级的学生进行循环
  38.     foreach($StudentList as $Student)
  39.     {
  40.         $TempStartPosition = $StartPosition;

  41.         $SpaceCount = $CombineCount / count($StudentList) / $RepeatTime;

  42.         for($J = 1; $J <= $SpaceCount; $J ++)
  43.         {
  44.             for($I = 0; $I < $RepeatTime; $I ++)
  45.             {
  46.                $Result[$TempStartPosition + $I][$ClassNo] = $Student;
  47.             }
  48.             $TempStartPosition += $RepeatTime * count($StudentList);
  49.         }
  50.         $StartPosition += $RepeatTime;
  51.     }
  52. }

  53. /* 打印结果 */
  54. echo "<pre>;";
  55. print_r($Result);
  56. ?>;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP