<table cellspacing="0" cellpadding="0"><tr><td class="t_f" id="postmessage_52235"> 碗相同,球相同,转换一下思路。<br>A列B行的表格,每个钢珠可放入一个格子,共C个钢珠。<br>移动钢珠,使出现各种可能。为了避免重复和遗漏,我们依据一下规律移动钢珠。<br>从左到右放置钢珠,第一列放置满后,再放置第二列;依次类推。<br>移动钢珠的时候,总是保证左边的任何一列钢珠数不少于比右边的任何一列。<br>每移动一个钢珠,出现一种可能的情况,计数器加1.<br> <div class="blockcode"> <div id="code_CHi"><ol> <li>$boxNum = 20;</li> <li>$size = 10;</li> <li>$total = 33;</li> <li> <li>//初始化</li> <li>$data = array();</li> <li>for($i=1;$i<=$boxNum;$i )<li>{<li> if($total>=$size)</li> <li> {</li> <li> $data[$i] = $size;</li> <li> $total -= $size;</li> <li> }</li> <li> else if($total>0)</li> <li> {</li> <li> $data[$i] = $total;</li> <li> $total = 0;</li> <li> }</li> <li> else</li> <li> {</li> <li> $data[$i] = 0;</li> <li> }</li> <li>}</li> <li> <li>for($i=1;$i<=$boxNum;$i ) echo $data[$i]."t";<li>echo "rn";<li><li><li><li>$count = 1;<li>while(true)<li>{<li> for($i=$boxNum;$i>=1;$i--)</li> <li> {</li> <li> //发现最后一个值</li> <li> if($data[$i]>0)</li> <li> {</li> <li> $last = $i;</li> <li> break;</li> <li> }</li> <li> }</li> <li> <li> list($prev,$next) = getPrevNext($data,$last);</li> <li> if($prev===false)</li> <li> {</li> <li> if($last<$boxNum)<li> {<li> if($data[1]>1)</li> <li> {</li> <li> list($prev,$next) = getPrevNext($data,$last 1);//启用新列</li> <li> }</li> <li> else</li> <li> {</li> <li> break;//结束</li> <li> }</li> <li> }</li> <li> else</li> <li> {</li> <li> break;//结束</li> <li> }</li> <li> }</li> <li> <li> $num = floor(($data[$prev] - $data[$next])/2);</li> <li> $data[$prev] -= $num;</li> <li> $data[$next] = $num;</li> <li> $count = $num;</li> <li> </li> <li> for($i=1;$i<=$boxNum;$i ) echo $data[$i]."t";<li> echo "num:".$num."rn";<li>}<li><li><li>echo '共有'.$count.'种可能'."rn";<li><li><li>function getPrevNext($data,$last)<li>{<li> $prev = $next = false;<li> for($i=$last-1;$i>=1;$i--)</li> <li> {</li> <li> if($data[$i]-$data[$i 1]>1)//发现一阶滚落</li> <li> {</li> <li> $prev = $i;</li> <li> $next = $i 1;</li> <li> break;</li> <li> }</li> <li> else if($data[$i]-$data[$last]>1)//发现多阶滚落</li> <li> {</li> <li> $prev = $i;</li> <li> for($k=$i 1;$k<=$last;$k )<li> {<li> if($data[$i]-$data[$k]>1)//发现最短多阶滚落</li> <li> {</li> <li> $next = $k;</li> <li> break;</li> <li> }</li> <li> }</li> <li> break;</li> <li> }</li> <li> }</li> <li> </li> <li> return array($prev,$next);</li> <li>}</li> <li> </ol></div> <em onclick="copycode($('code_CHi'));">复制代码</em> </div> </td></tr></table> <div id="comment_52235" class="cm"> </div> <div id="post_rate_div_52235"></div> <br><br>