Heim  >  Artikel  >  Backend-Entwicklung  >  A个碗 每碗可装B个球 共有C个球 问有多少种装法(球完全相同)

A个碗 每碗可装B个球 共有C个球 问有多少种装法(球完全相同)

WBOY
WBOYOriginal
2016-07-25 08:48:221277Durchsuche
碗相同,球相同,转换一下思路。
A列B行的表格,每个钢珠可放入一个格子,共C个钢珠。
移动钢珠,使出现各种可能。为了避免重复和遗漏,我们依据一下规律移动钢珠。
从左到右放置钢珠,第一列放置满后,再放置第二列;依次类推。
移动钢珠的时候,总是保证左边的任何一列钢珠数不少于比右边的任何一列。
每移动一个钢珠,出现一种可能的情况,计数器加1.
  1. $boxNum = 20;
  2. $size = 10;
  3. $total = 33;
  4. //初始化
  5. $data = array();
  6. for($i=1;$i{
  7. if($total>=$size)
  8. {
  9. $data[$i] = $size;
  10. $total -= $size;
  11. }
  12. else if($total>0)
  13. {
  14. $data[$i] = $total;
  15. $total = 0;
  16. }
  17. else
  18. {
  19. $data[$i] = 0;
  20. }
  21. }
  22. for($i=1;$iecho "\r\n";
  23. $count = 1;
  24. while(true)
  25. {
  26. for($i=$boxNum;$i>=1;$i--)
  27. {
  28. //发现最后一个值
  29. if($data[$i]>0)
  30. {
  31. $last = $i;
  32. break;
  33. }
  34. }
  35. list($prev,$next) = getPrevNext($data,$last);
  36. if($prev===false)
  37. {
  38. if($last {
  39. if($data[1]>1)
  40. {
  41. list($prev,$next) = getPrevNext($data,$last+1);//启用新列
  42. }
  43. else
  44. {
  45. break;//结束
  46. }
  47. }
  48. else
  49. {
  50. break;//结束
  51. }
  52. }
  53. $num = floor(($data[$prev] - $data[$next])/2);
  54. $data[$prev] -= $num;
  55. $data[$next] += $num;
  56. $count += $num;
  57. for($i=1;$i echo "num:".$num."\r\n";
  58. }
  59. echo '共有'.$count.'种可能'."\r\n";
  60. function getPrevNext($data,$last)
  61. {
  62. $prev = $next = false;
  63. for($i=$last-1;$i>=1;$i--)
  64. {
  65. if($data[$i]-$data[$i+1]>1)//发现一阶滚落
  66. {
  67. $prev = $i;
  68. $next = $i+1;
  69. break;
  70. }
  71. else if($data[$i]-$data[$last]>1)//发现多阶滚落
  72. {
  73. $prev = $i;
  74. for($k=$i+1;$k {
  75. if($data[$i]-$data[$k]>1)//发现最短多阶滚落
  76. {
  77. $next = $k;
  78. break;
  79. }
  80. }
  81. break;
  82. }
  83. }
  84. return array($prev,$next);
  85. }
复制代码


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn