& e+ N5 z$ L ]1 E/ f 重量 5 3 2 1 , x( B, m% p6 p5 t
5 L& [1 z. F: K* P/ {/ O 价值 4 4 3 1 7 f# L$ u' j" S: w) p
6 m+ ^0 r3 Z5 o) `: R 并设限制重量为7。则按以上算法,下图表示找解过程。由图知,一旦找到一个解,算法就进一步找更好的佳。如能判定某个查找分支不会找到更好的解,算法不会在该分支继续查找,而是立即终止该分支,并去考察下一个分支。 & P( _# a4 b. K3 I4 } @, [ D5 \0 R, O1 g0 Q" z# \, z; x! d 按上述算法编写函数和程序如下: ' j. k5 J3 ^! [- O# S% u7 |2 D
9 I5 U6 m! s5 N7 v. F3 k# k! s* e 【程序】 / p. C1 \! T& R) O4 x; T& x) T 2 Y; c/ Y B8 @! L. U5 C$ [& o: f4 K # include , f) |: r. E& U/ b }3 c3 E5 a & |' N1 b7 u) q3 l # define N 100 ; \9 i4 C! z8 D
7 M7 C M# A! y( z: s6 |4 v double limitW,totV,maxV; 5 C# {8 y- t/ t q M+ |
/ Q9 ~5 J" v& O. ^- ^+ {1 M7 t int option[N],cop[N]; " O3 z# m: _, X) {) w: ?; f. v( A. H8 z: [% Z
struct { double weight; 8 _5 \: F; F+ C9 e6 b, g. q 2 s9 ^4 _% c0 n T1 V1 n! m+ B double value; . P) s5 s" d. ? C5 i" l1 w# b* W8 I, c1 [4 [6 |1 @
}a[N]; 2 w+ ]1 q* [* o+ C; n, ~2 x/ g
& l+ R; N( d6 x int n; ; a* X3 E6 L/ }# f8 S5 C, ~6 ^( m" x; q
void find(int i,double tw,double tv) ' x! w* `- ^; r' q; {6 z% ?! N* m
{ int k; + |# v4 @! P) s) @/ U
$ z/ C4 D! x3 r* u$ d4 G- d: x /*考虑物品i包含在当前方案中的可能性*/ : c% X+ I3 `3 t" I7 a$ b' B: M+ b7 b
if (tw+a.weight<=limitW) ! a7 l: S" s4 X2 M ( U9 [/ J5 P/ J6 P2 z { cop=1; 7 [* x2 \# ]- O7 p/ u6 ?0 \6 p4 v3 y1 |, {* \- [6 h! k; p1 N
if (i / _( j6 A0 M' u* l8 x# E " y' m+ f D2 q, G" s else : v) ^" Y) k3 N3 D) f, L( g
' k5 j$ l* [5 ^4 Q5 y7 X { for (k=0;k $ B j& K8 X+ F3 z d
' S; e. o$ E' S) \% O) J8 \* V
option[k]=cop[k]; 6 {4 s: O9 n6 j3 z, i9 v4 l 6 \& o+ c& E _ maxv=tv; 1 F$ A) D2 A5 N4 [8 [) O
' P! o, r, p2 M
} 8 h" l/ u! l' s% x/ J# F: `8 {
0 G7 @- [2 G I+ @, ?; @! @2 [ cop=0; * h' n8 ?4 d# ?0 N; P5 d/ n1 w 7 [" o( x0 f7 H9 O9 e } 9 ?1 a' S' b1 Q- n
4 u8 v) i6 u" H# N /*考虑物品i不包含在当前方案中的可能性*/ & X2 G- _1 T+ f/ H$ _ 2 p* P( W0 {0 ?# P( I( ~8 x if (tv-a.value>maxV) 8 Y R3 y8 T$ U4 Z% U
9 H5 D9 |0 {4 |8 p; J8 C& Z" @) i
if (i 7 ]: [. G5 |2 y ! l1 R8 N5 |& f# r. S else 4 D: E7 R- y* S8 ~# H$ s5 K
) E/ t4 i8 t+ L; I2 f" G5 V { for (k=0;k 3 P# P2 D. M# j' @6 b- [+ ?, h4 k# M- U' J' _8 v6 q1 W
option[k]=cop[k]; % ]* f1 T% O% H/ o! u
. w0 `4 i1 ]: j; X9 V
maxv=tv-a.value; + ~: n7 @0 d; F1 w5 u* ]. k7 D& i 7 S8 z* d0 h4 `) t0 g6 z } 1 I- b1 R& s v) n( `- f
7 Q, M4 l1 {3 S' L- F% J { int k; . Z$ v8 ?7 W4 s4 c; d8 S9 a, ] ' w" p }$ o. K8 W0 s double w,v; % v# T1 h: U3 x x5 |/ ~
X" ^. r7 o* B, M printf(“输入物品种数\n”); / I/ T, ]6 T5 d9 q$ Y. D# I, a# N 6 j/ W2 E, c" S( A# u/ A scanf((“%d”,&n); & m5 a. A# u2 g. m! D1 q" W! O* |
8 m& T: j+ b, \5 ?) T" F6 `
printf(“输入各物品的重量和价值\n”); 3 H# W y; R3 x3 p, z3 n: v, W" B' d
for (totv=0.0,k=0;k 9 g) o2 ?2 T; C- @* k) F2 D. L ; Q& y( O) j% B {8 }( E { scanf(“%1f%1f”,&w,&v); B' t6 o& m/ a( U% e1 l: d2 c 2 |- }/ g) O7 I% t( p+ [4 D, ?" v a[k].weight=w; + T# [( D& g; E% U
1 h9 @- f+ o$ ]. _' e e a[k].value=v; ! ^. \* M0 [- s4 t' Q' ~0 Q% L9 O6 S, z4 G
totV+=V; ; J+ t6 ?( _1 y1 P9 A% ^* A& ~ l3 Q2 X; o( K
7 x( n+ i8 n* }; \, d1 Y: M* x
} ( c* c ^5 r2 b2 W6 I3 N4 D5 f, I
( C8 k. M* A, r5 S2 W! f& f
printf(“输入限制重量\n”); ' Y! n( z3 K, Q" T* ]- b9 b g
2 U& |0 N' l7 ^& W scanf(“%1f”,&limitV); * e" s5 z0 A# O& i3 Z3 x" v
- E$ m4 ^: }( [+ N( M" U
maxv=0.0; , a: i( V y: q% D9 } T" S2 L; x+ W. @7 x# H& Z4 ]* r7 }5 P
for (k=0;k find(0,0.0,totV); . _9 e% ?: ^( W7 n/ E5 o1 D8 m A0 T6 [+ d4 C" y# i for (k=0;k 7 f- I+ ^: _4 b$ u" Y
6 x- W b# l+ r( U if (option[k]) printf(“%4d”,k+1); 6 G" T# H+ z' k* n5 U$ ~
6 m' Z& k* |$ D. G! y printf(“\n总价值为%.2f\n”,maxv); ( E& |; e! o# Y- p; c: ]& b3 E
9 K+ Y5 j" A' l* r6 K
} 8 ?, e' m5 B( k# ]: y4 F
) u( O4 R i' W3 Q% f. W
作为对比,下面以同样的解题思想,考虑非递归的程序解。为了提高找解速度,程序不是简单地逐一生成所有候选解,而是从每个物品对候选解的影响来形成值得进一步考虑的候选解,一个候选解是通过依次考察每个物品形成的。对物品i的考察有这样几种情况:当该物品被包含在候选解中依旧满足解的总重量的限制,该物品被包含在候选解中是应该继续考虑的;反之,该物品不应该包括在当前正在形成的候选解中。同样地,仅当物品不被包括在候选解中,还是有可能找到比目前临时最佳解更好的候选解时,才去考虑该物品不被包括在候选解中;反之,该物品不包括在当前候选解中的方案也不应继续考虑。对于任一值得继续考虑的方案,程序就去进一步考虑下一个物品。 # r" `" E. ~/ D( v' T5 P 5 V1 J5 h. G0 D 【程序】 ' |4 [" I1 @" a! F" K9 R W0 ` _0 R2 r) y; `6 @" C* ~
# include ( K, g& X; U2 k' K
: b) n6 d7 B% P+ N8 [ # define N 100 $ `6 _- k1 ?, f, L
0 \* h `3 m! u1 v
double limitW; + @& e9 j# L, n9 I) l 7 _1 Y1 e4 q- j8 \/ j int cop[N]; 5 E @# f6 I4 m# \
1 j+ s" C. b6 i! `) @: N$ h struct ele { double weight; & a! ~9 Z- N* K! F6 Z$ r
! e( T5 W2 ]/ f' j, [$ T# ]+ f
double value; - i" F" ]; `3 z: _5 e0 V0 q! G4 ~: \( d4 Y
} a[N]; 7 q* W% R, r# x) c# d
; R! u3 `: U+ O- f; H* ]% D int k,n; % r6 ~# _% x1 a( M
; Q4 k) W. s" J9 x
struct { int ; ' W8 C* G! a7 I) Z: E6 z$ z
- D4 q! i1 q# v
double tw; 7 Y$ C: \# d! }" \, i* N+ A
/ M* m0 i4 _ z. X5 t
double tv; : Z0 n5 m7 I' u& T5 s1 p# y4 s, d8 ?$ L" l$ M Z8 E
}twv[N]; ; m3 M! a5 Q- X