求若干个数中之和最接近12的集合,怎样用程序实现这个功能 你们好。我最近写一个钢筋公司的系统客户的订单要求做各种长度的钢筋,如 3.5 , 4, 6, 5.5, 4.2等等还没有切割的钢筋都是12米长。用系统计算怎样切割才能节省一点呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我现在写出了一个函数,可是出来的结果并不是最优的结果,要优化一下大虾能帮我看一下么? function ironcutter($iron,$ironcheck = NULL,$ironset = NULL){ /*$iron 指客户订单,各种长度封装在数组里 $ironcheck 指需要检查是否最优化的组合,都会丢在这里,由程序检查,称为“待判断组合” $ironset 指确认是最优化的组合,都会丢在这里,称为“已确认组合”*/ define("LIMITER",12); $c = 12; if(count($iron) == 0){ /*当客户订单都被判断完之后,检查“待判断组合”里还有没有值,如果有的话,丢进“已确认组合里”*/ if($ironcheck != NULL){ array_push($ironset,$ironcheck); } return $ironset; }elseif($ironcheck == NULL){ /*如检测到“待判断组合”为空时,则丢一个数字进函数挑选最优组合*/ foreach($iron as $key => $val){ ; unset($iron[$key]); return ironcutter($iron,array($key=>$val),$ironset); } }else{ $check = false; $sum = array_sum($ironcheck); foreach($iron as $key => $val){ if($sum + $val < LIMITER){ $check = true; break; } } /*判断组合是否已无法再增加任何数字,如增加会超过限制值*/ if($check){ /*用遍历数组挑选最优值,挑选损耗最小的组合*/ foreach($iron as $key => $val){ $total = $sum + $val; if( LIMITER - $total <= $c && LIMITER -$total >=0){ $c = LIMITER - $total; $k = $key; $v = $val; } } /*挑选出最优值,删除客户订单中的这个值,放进待检查组合里,再丢进函数检查能否增加其他数字*/ unset($iron[$k]); $ironcheck[$k] =$v; return ironcutter($iron,$ironcheck,$ironset); }else{ /*如果组合无法再增加数字,则把它放进已确认组合里。*/ $ironset[count($ironset)] = $ironcheck; $ironcheck = NULL; return ironcutter($iron,$ironcheck,$ironset); } } } 算法不难,难在于效率。当订单里,有上万个钢筋长度的时候,效率怎么解决大概思路函数:订单为空的时候,判断是否最优解否则循环订单{ A当前的钢筋剩余长度<订单值 选择新的一跟钢筋【递归】 B当前钢筋剩余长度>=订单值 { 该订单,就截在这里 ……【递归】 但是,也可以回滚一下,能截,但选择下一个订单截【递归】 }} 我上面的函数运行了一下客户订单如下array(37) { [1]=> string(1) "7" [2]=> string(1) "7" [3]=> string(1) "6" [4]=> string(1) "6" [5]=> string(1) "6" [6]=> string(1) "6" [7]=> string(1) "6" [8]=> string(1) "6" [9]=> string(1) "6" [10]=> string(1) "6" [11]=> string(1) "6" [12]=> string(1) "6" [13]=> string(3) "5.9" [14]=> string(3) "5.9" [15]=> string(3) "5.9" [16]=> string(3) "5.9" [17]=> string(3) "5.9" [18]=> string(1) "5" [19]=> string(1) "5" [20]=> string(1) "5" [21]=> string(1) "5" [22]=> string(3) "4.9" [23]=> string(3) "4.9" [24]=> string(1) "4" [25]=> string(1) "4" [26]=> string(1) "4" [27]=> string(1) "4" [28]=> string(1) "4" [29]=> string(1) "4" [30]=> string(3) "3.9" [31]=> string(3) "3.9" [32]=> string(3) "3.4" [33]=> string(3) "3.4" [34]=> string(3) "3.4" [35]=> string(3) "3.4" [36]=> string(1) "3" [37]=> string(1) "3"}用程序得出的结果array(16) { [0]=> array(2) { [1]=> string(1) "7" [21]=> string(1) "5" } [1]=> array(2) { [2]=> string(1) "7" [20]=> string(1) "5" } [2]=> array(2) { [3]=> string(1) "6" [12]=> string(1) "6" } [3]=> array(2) { [4]=> string(1) "6" [11]=> string(1) "6" } [4]=> array(2) { [5]=> string(1) "6" [10]=> string(1) "6" } [5]=> array(2) { [6]=> string(1) "6" [9]=> string(1) "6" } [6]=> array(2) { [7]=> string(1) "6" [8]=> string(1) "6" } [7]=> array(2) { [13]=> string(3) "5.9" [17]=> string(3) "5.9" } [8]=> array(2) { [14]=> string(3) "5.9" [16]=> string(3) "5.9" } [9]=> array(2) { [15]=> string(3) "5.9" [19]=> string(1) "5" } [10]=> array(2) { [18]=> string(1) "5" [23]=> string(3) "4.9" } [11]=> array(3) { [22]=> string(3) "4.9" [29]=> string(1) "4" [37]=> string(1) "3" } [12]=> array(3) { [24]=> string(1) "4" [28]=> string(1) "4" [27]=> string(1) "4" } [13]=> array(3) { [25]=> string(1) "4" [26]=> string(1) "4" [31]=> string(3) "3.9" } [14]=> array(3) { [30]=> string(3) "3.9" [35]=> string(3) "3.4" [34]=> string(3) "3.4" } [15]=> array(3) { [32]=> string(3) "3.4" [33]=> string(3) "3.4" [36]=> string(1) "3" }}貌似我写出的程序如果组合只有两个数的,就能能出最优结果,但是组合有三个数的,就不能得出最优的结果了。不知道程序哪里写错了 求救啊,浏览器端与Mysql的中文字符处理问题 用页面或表单传递字符串时的转义符问题 网站被黑了,请高手进来看看这段代码是干什么的,谢谢了!!! PHP网站发布的配置问题,希望大家给予帮助,小弟感激不尽!(急!!!!!) 请教一个 require_once 包含问题 新站发布,欢迎指点! -->关于搜索引擎:请问在结果中查找是怎么实现的??? mail()发送邮件的问题 求教一个紧急问题 关于netscape的输入框保留用户名和密码的问题 求助:elseif的分支长达16个 有没有更能好的解决方案? MYsql触发器问题 搞了一下午没搞明白
大虾能帮我看一下么? function ironcutter($iron,$ironcheck = NULL,$ironset = NULL){
/*$iron 指客户订单,各种长度封装在数组里
$ironcheck 指需要检查是否最优化的组合,都会丢在这里,由程序检查,称为“待判断组合”
$ironset 指确认是最优化的组合,都会丢在这里,称为“已确认组合”
*/
define("LIMITER",12);
$c = 12;
if(count($iron) == 0){
/*当客户订单都被判断完之后,检查“待判断组合”里还有没有值,如果有的话,丢进“已确认组合里”*/
if($ironcheck != NULL){
array_push($ironset,$ironcheck);
}
return $ironset;
}elseif($ironcheck == NULL){
/*如检测到“待判断组合”为空时,则丢一个数字进函数挑选最优组合*/
foreach($iron as $key => $val){
;
unset($iron[$key]);
return ironcutter($iron,array($key=>$val),$ironset);
}
}else{
$check = false;
$sum = array_sum($ironcheck);
foreach($iron as $key => $val){
if($sum + $val < LIMITER){
$check = true;
break;
}
}
/*判断组合是否已无法再增加任何数字,如增加会超过限制值*/
if($check){
/*用遍历数组挑选最优值,挑选损耗最小的组合*/
foreach($iron as $key => $val){
$total = $sum + $val;
if( LIMITER - $total <= $c && LIMITER -$total >=0){
$c = LIMITER - $total;
$k = $key;
$v = $val;
}
}
/*挑选出最优值,删除客户订单中的这个值,放进待检查组合里,再丢进函数检查能否增加其他数字*/
unset($iron[$k]);
$ironcheck[$k] =$v;
return ironcutter($iron,$ironcheck,$ironset);
}else{
/*如果组合无法再增加数字,则把它放进已确认组合里。*/
$ironset[count($ironset)] = $ironcheck;
$ironcheck = NULL;
return ironcutter($iron,$ironcheck,$ironset);
}
}
}
函数:
订单为空的时候,判断是否最优解
否则循环订单
{
A当前的钢筋剩余长度<订单值 选择新的一跟钢筋【递归】 B当前钢筋剩余长度>=订单值
{
该订单,就截在这里 ……【递归】
但是,也可以回滚一下,能截,但选择下一个订单截【递归】
}
}
客户订单如下array(37) {
[1]=>
string(1) "7"
[2]=>
string(1) "7"
[3]=>
string(1) "6"
[4]=>
string(1) "6"
[5]=>
string(1) "6"
[6]=>
string(1) "6"
[7]=>
string(1) "6"
[8]=>
string(1) "6"
[9]=>
string(1) "6"
[10]=>
string(1) "6"
[11]=>
string(1) "6"
[12]=>
string(1) "6"
[13]=>
string(3) "5.9"
[14]=>
string(3) "5.9"
[15]=>
string(3) "5.9"
[16]=>
string(3) "5.9"
[17]=>
string(3) "5.9"
[18]=>
string(1) "5"
[19]=>
string(1) "5"
[20]=>
string(1) "5"
[21]=>
string(1) "5"
[22]=>
string(3) "4.9"
[23]=>
string(3) "4.9"
[24]=>
string(1) "4"
[25]=>
string(1) "4"
[26]=>
string(1) "4"
[27]=>
string(1) "4"
[28]=>
string(1) "4"
[29]=>
string(1) "4"
[30]=>
string(3) "3.9"
[31]=>
string(3) "3.9"
[32]=>
string(3) "3.4"
[33]=>
string(3) "3.4"
[34]=>
string(3) "3.4"
[35]=>
string(3) "3.4"
[36]=>
string(1) "3"
[37]=>
string(1) "3"
}
用程序得出的结果array(16) {
[0]=>
array(2) {
[1]=>
string(1) "7"
[21]=>
string(1) "5"
}
[1]=>
array(2) {
[2]=>
string(1) "7"
[20]=>
string(1) "5"
}
[2]=>
array(2) {
[3]=>
string(1) "6"
[12]=>
string(1) "6"
}
[3]=>
array(2) {
[4]=>
string(1) "6"
[11]=>
string(1) "6"
}
[4]=>
array(2) {
[5]=>
string(1) "6"
[10]=>
string(1) "6"
}
[5]=>
array(2) {
[6]=>
string(1) "6"
[9]=>
string(1) "6"
}
[6]=>
array(2) {
[7]=>
string(1) "6"
[8]=>
string(1) "6"
}
[7]=>
array(2) {
[13]=>
string(3) "5.9"
[17]=>
string(3) "5.9"
}
[8]=>
array(2) {
[14]=>
string(3) "5.9"
[16]=>
string(3) "5.9"
}
[9]=>
array(2) {
[15]=>
string(3) "5.9"
[19]=>
string(1) "5"
}
[10]=>
array(2) {
[18]=>
string(1) "5"
[23]=>
string(3) "4.9"
}
[11]=>
array(3) {
[22]=>
string(3) "4.9"
[29]=>
string(1) "4"
[37]=>
string(1) "3"
}
[12]=>
array(3) {
[24]=>
string(1) "4"
[28]=>
string(1) "4"
[27]=>
string(1) "4"
}
[13]=>
array(3) {
[25]=>
string(1) "4"
[26]=>
string(1) "4"
[31]=>
string(3) "3.9"
}
[14]=>
array(3) {
[30]=>
string(3) "3.9"
[35]=>
string(3) "3.4"
[34]=>
string(3) "3.4"
}
[15]=>
array(3) {
[32]=>
string(3) "3.4"
[33]=>
string(3) "3.4"
[36]=>
string(1) "3"
}
}
貌似我写出的程序如果组合只有两个数的,就能能出最优结果,但是组合有三个数的,就不能得出最优的结果了。不知道程序哪里写错了