7 ~' H, P* E9 c& Y8 z1 D if (i + U8 S o5 R* E7 H) D$ _; a. P3 N( K2 z+ ?
else 6 ^5 r+ v1 ^0 F% ^ 7 j* C* ~9 S0 W3 d { for (k=0;k ' H( y* o: n9 ~, c8 d; c
4 }4 ^% b$ l$ h' d1 l" B) Q option[k]=cop[k]; 1 R$ y2 J |; N0 n5 B + B7 Q( i$ b5 R' f C. m maxv=tv; * V2 u% `" ~- i" Z$ S2 j" X
8 {& y& o8 z: L# o' x' t } 1 J6 a, k9 j' d7 i0 g
* m/ o1 S: G. p) `0 W5 L" o cop=0; , K9 s/ m. N7 p3 c% a6 k
0 G; y# ]" i# F( K) n: v5 v4 v& q } ! Q9 M# [1 ^3 c' d ; j Y7 {0 p& [/ G5 h6 F. h# A /*考虑物品i不包含在当前方案中的可能性*/ 8 B9 ?# @# V- g( z * A) m+ |' } g9 z if (tv-a.value>maxV) ! _5 ^& }3 a, t E+ c9 V0 U2 o4 g/ W! h9 F$ r
if (i 4 F; \ p, S Z
6 C8 _# C& |) E7 _
else R' P7 ~8 N( d& Y9 @ @. C' s6 S9 Q% H2 E' O8 v
{ for (k=0;k # p2 w% `: B9 w9 _) c7 n4 D1 V 2 {( X% z4 C( P/ {5 M7 U# N option[k]=cop[k]; 0 e# X5 w. y/ Z, ]2 f: i3 s- g: k$ D+ j& n- `9 r, _" |8 B. @
maxv=tv-a.value; & F* ^, U7 P# t- y2 b
" ] D% n* ]8 x
} ( X$ J1 T: }$ U" S5 k
/ w& m: t; B# l) h& X, z& P3 Q
} + r) G, Y: }0 ^1 ^0 R% [7 G' a( u8 Q8 E
void main() % u' ]( D8 l! w. O( x2 a6 r3 O7 a+ |6 L! s8 Y5 x1 B# m' U# Q
{ int k; 7 r# F q% o1 i8 v+ z
9 b) g0 ?0 x7 ~$ \5 Q$ ?# Y8 t8 N double w,v; - A3 Z( e8 F" S' E# J
c, m) D) m- T! p7 t
printf(“输入物品种数\n”); 6 U) X7 d+ ^! u' n9 W5 Z, U7 y( ^ . i# l! `$ P1 W6 ~) ~2 B& Z scanf((“%d”,&n); $ {' ^6 P4 O4 z& ^) J3 T. t . Z0 u+ J! E& d9 i" @6 o ~- I printf(“输入各物品的重量和价值\n”); ! O/ V& U$ ~+ J9 H, v# P4 Y6 w% ~ y
" a6 P9 m7 b6 }0 a" `- g
for (totv=0.0,k=0;k # `; C3 A& M9 h1 C | Q" f; _3 v
7 |8 @: c+ @+ r" }
{ scanf(“%1f%1f”,&w,&v); 5 h( Q& W+ {/ G. o1 i' d 7 m( \8 [5 M( e% \3 b# l8 l a[k].weight=w; 7 m2 Z1 Y6 b$ j
; M. n" S: M& b4 K a[k].value=v; . K- s+ f! ~4 k9 B7 i( I* n, g
2 ?/ W! ?9 z$ @6 q2 m totV+=V; 2 u2 C) F+ _; Z; x. Z' D9 D: }
2 s6 G, X$ e+ L0 z7 c } 4 Y' c: ~' i. q- U % ]' N4 k0 r$ t6 Q. k printf(“输入限制重量\n”); & p# Q; h5 w9 A; ^! a' @4 x 9 ~+ J" m- o2 \+ ^- h scanf(“%1f”,&limitV); 3 @) S1 u( w& f
, u" r% v7 C# o6 J; N. ^% c maxv=0.0; - O9 ~2 H3 ^0 j, s' Q1 p# Z. l }! Q! Y) u% O3 [1 p
for (k=0;k find(0,0.0,totV); ! a2 v9 @4 n' q. Q" O1 S, C6 P) p4 e" A, V+ p& r! r
for (k=0;k 6 M: M# m2 A, `( |2 e' ]0 A4 D
* H1 O' x9 e5 f/ i( Y& r if (option[k]) printf(“%4d”,k+1); 8 I) X4 h# F3 n* _5 H7 v4 C
2 v' {# C( V* N) ]: i printf(“\n总价值为%.2f\n”,maxv); - }! e0 {5 j4 v& K
6 {8 i0 Q1 K9 ~" `- ?
} ! F1 r9 }( U' p+ \* F( H5 B% x $ o6 j5 Q. y3 J# r5 u 作为对比,下面以同样的解题思想,考虑非递归的程序解。为了提高找解速度,程序不是简单地逐一生成所有候选解,而是从每个物品对候选解的影响来形成值得进一步考虑的候选解,一个候选解是通过依次考察每个物品形成的。对物品i的考察有这样几种情况:当该物品被包含在候选解中依旧满足解的总重量的限制,该物品被包含在候选解中是应该继续考虑的;反之,该物品不应该包括在当前正在形成的候选解中。同样地,仅当物品不被包括在候选解中,还是有可能找到比目前临时最佳解更好的候选解时,才去考虑该物品不被包括在候选解中;反之,该物品不包括在当前候选解中的方案也不应继续考虑。对于任一值得继续考虑的方案,程序就去进一步考虑下一个物品。 - ?% t+ j$ O4 H0 s: A |8 h( c0 y% H/ K 【程序】 - ^: R. Z5 D7 u/ r+ Y/ u- k 7 i, j# a2 t% _# C, [( i # include ) g* B' V+ r r
3 y, N {- f' Y # define N 100 $ F$ N7 f: W* l9 ]
2 J6 R0 j# F8 U) h$ K. h. f
double limitW; 8 S' f4 {1 B V6 H% _( Z7 C
[( T; W& z3 P int cop[N]; " y. c6 K; a, [5 ^$ L+ E& _3 Z8 T# Y* e$ i9 v* X* b6 u
struct ele { double weight; 3 i7 c( o' R% K- X 1 X5 s) X+ z" O! J" p0 [ double value; 2 }! L& @; v! z* k( J' H/ F7 f/ w8 f- n
} a[N]; - f' i6 b0 v3 p# X! k
8 C; W9 x. F ?4 e# ?
int k,n; - y' k* L ]; f9 a( x8 d F* N& n7 c8 ^0 v
struct { int ; - h- r0 x- {6 O! }7 i7 p; r( {1 M6 t( k4 p* v5 D% ^7 j! f
double tw; % }3 q) u# a6 U1 i: g4 R2 \4 A+ x) Q
V9 [# Q4 V o# }; } double tv; 6 T6 n+ \7 a4 k; @. L, w. F) d; z' m9 C" P8 ^0 H
}twv[N]; 8 M5 q a1 _* [9 N }& _4 A s7 c) X
void next(int i,double tw,double tv) 9 V3 I6 r) X; Y) V: c 4 f8 y8 x# K8 V8 Q y& c- l0 n { twv.=1; ' o3 Y1 ~' d) j! i1 j