本文实例讲述了PHP回溯法解决0-1背包问题的方法。分享给大家供大家参考。具体分析如下:
这段代码是根据《软件设计师》教程的伪代码写的;
最麻烦的不是伪代码改成php,而是数组下标从0开始,及相应的下标判断问题;
带着调试输出一块写上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
<?php
$v_arr = array (11,21,31,33,43,53,55,65);
$w_arr = array (1,11,21,23,33,43,45,55);
$n = count ( $w_arr );
//测试输出
var_dump(bknap1(110));
//var_dump(bound(139,89,7,110));
function bound( $v , $w , $k , $W_total ){
global $v_arr , $w_arr , $n ;
$b = $v ;
$c = $w ;
//var_dump($W_total);var_dump($n);var_dump($k);var_dump($v);var_dump($w);
//die;
for ( $i = $k +1; $i < $n ; $i ++){
$c = $c + $w_arr [ $i ];
//var_dump($W_total);var_dump($c);
if ( $c < $W_total )
$b += $v_arr [ $i ];
else {
//var_dump((1-($c-$W_total)/$w_arr[$i])*$v_arr[$i]);
$b = $b +(1-( $c - $W_total )/ $w_arr [ $i ])* $v_arr [ $i ];
return $b ;
}
}
/*var_dump('------bound head');
var_dump($k);
var_dump($b);
var_dump('------bound end');*/
return $b ;
}
function bknap1( $W_total ){
global $v_arr , $w_arr , $n ;
$cw = $cp = 0;
$k = 0;
$fp = -1;
while (true){
while ( $k < $n && $cw + $w_arr [ $k ]<= $W_total ){
$cw += $w_arr [ $k ];
$cp += $v_arr [ $k ];
$Y_arr [ $k ] = 1;
$k +=1;
}
//var_dump($cw);var_dump($cp);var_dump($Y_arr);var_dump($k);var_dump($n);
if ( $k == $n ){
$fp = $cp ;
$fw = $cw ;
$k = $n -1;
$X_arr = $Y_arr ;
//bound($cp,$cw,$k,$W_total);
//var_dump(bound($cp,$cw,$k,$W_total),$fp,$k);die;
//var_dump($fp);var_dump($fw);var_dump($Y_arr);var_dump($k);var_dump($n);
} else {
$Y_arr [ $k ] = 0;
}
//var_dump($Y_arr);var_dump($k);var_dump($n);//die;
//var_dump(bound($cp,$cw,$k,$W_total),$fp);die;
while (bound( $cp , $cw , $k , $W_total )<= $fp )
{
while ( $k >=0 && $Y_arr [ $k ]!=1){
$k -= 1;
}
if ( $k <0)
{
return $X_arr ;
}
var_dump( $k );
$Y_arr [ $k ] = 0;
$cw -= $w_arr [ $k ];
$cp -= $v_arr [ $k ];
}
$k += 1;
}
}
?>
|
希望本文所述对大家的php程序设计有所帮助。