이 펜 질문입니다
첫째, 선물 카드를 시작하는 케이크 가게, 카드는 매장 케이크, 케이크의 각 구매를 구입하는 데 사용할 수 있습니다 사용합니다. 카드 소자 R의 액면가는 무효 카드의 잔액을 닫은 후, 한 번만 사용될 수있다. 정수는 케이크 가격의 모든 종류를 저장할 수 있습니다 알려진, 적어도, 구매 체크 아웃 후 카드의 잔액을 만드는 방법을 찾을 수 있습니다.
상태가 다시 개별 의사 결정을 유지하기 위해 주제를,뿐만 아니라 0-1 배낭 문제를 구입하는 방법입니다 찾는, 그 때 기다려야한다 (하나 개 이상의 결과가있을 수 있습니다, 그것은 마지막 상태를 유지 할 수 없음) ,
역 추적 할 때 잘못된 출력을하지 않도록주의해야
1 사용법 #include " pch.h " 2 #INCLUDE <iostream> 3 #INCLUDE < 문자열 > 4 이용한 스페이스 성병; 5 정적 CONST의 INT의 M = 20 ; 6 정적 CONST의 INT의 array_ [] = { 1 , 2 , 5 , 9 , 10 , 11 , 8 , 3 , 20 , 80 }; 7 8 INT ** 시험 (INT 및 N-) . (9) { 10 // M 쇼핑 카드의 번호, 케이크를위한 초기 값을 array_이다 . (11) (12)는 N- = sizeof의 (array_) / sizeof의 ( INT ) (13)는 INT ** P = 새로운 새 INT * [N-] 14 위한 ( int로 I = 0 ; I <N-; I ++가 ) 15 { 16 P [I]가 = 새로운 새 INT [M +의 1이다. ] . 17 } 18 인 위해 ( INT I = 0; I <N-; I ++ ) 19. 에 대한 ( INT J = 0 ; J <= M, J ++ ) (20)는 P [I] [J] = 0 , 21는 22이다 // 선형 계획법 23 // 또한, p [0]이 부여 24 IF ([array_ 0 P는 [] <= M) 0 ] [array_ [ 0 ] = array_ [ 0 ] 25 대 ( INT I = 1. ; I <N-; I ++ ) (26)가 { 27 // 전방으로부터 구매하지 처음 구매 28 IF (array_ [I] <=M) 29 { 30 P가 [I]가 = [I]는 [array_] array_ [I]는, 31이다 } 32 // 판정은, 그것이 구입하는 경우, 축적 케이스 (33)하면이다 위해 ( INT J = . 1 ; J <= M, J ++ ) (34)가 { 35 IF - (P [I . (1) [J] =!] 0 ) 36 { 37 INT의 P [I = 값 - . 1 ] [J] + array_ [I]는, 38이다 // 나중에 층이면 물품 (39) IF (가격 <= M) 40 { (41)는 P [I] 값 = 값; 42은 43된다 } 44이다 // 생성물 층을 구입하지 않으면 45 // 이 테이블은이 제거하는 방법 재생할 경우에만 다시 재귀 적 방법을 모두 재생하는 데 사용된다 (46) (47) P [I] [J] = P - [I (1). [J]] (48) (49) (50) } (51)이다 } (52)는 53이다 } (54)는 55 대 ( int로 I = 0 ; I는 <N- I가 ++ ) (56)가 { 57 인 위해 ( INT J =. 1 ; J <= M, J ++ ) 58 { 59 COUT << P [I] [J] << " " ; 60 } 61는 COUT << ; ENDL 62이다 } (63)이 복귀 ; P 64 } 65 66 67 // 현재 검색 제 n 층, 값의 잔존 용량에 대한 68 의 INT doPrint ( INT ** P, INT의 N, INT의 값) 69 { 70 INT의 합 = 0 ; 71이다 // 경우 구매 직접 종단 72 IF (값 - array_ [N-] == 0 ) (73)가 { 74 COUT은 << array_ [N-] << ENDL; 75 창 1이다. ] (76) } (77) INT의 왼쪽 = 값 - [N-] array_; 78 IF (왼쪽> 0 ) 79 { 80 (81) 에 대한 ( INT I = N-- 1. , I> = 0 , 난 - ) 82 { 83 // 데이터 상속 때문에, 균형 상태 각 플레이 테이블 대표 하나를 언급하는 것은 불가능하지만 이러한 각 층의 비 - 제로 값이 아닌 의미 갖는다 84 //그리고 재귀 될 수 나중에 재생 테이블 충분한 자금이있는 경우에만 (즉, 왼쪽 array_가 [I]가> = 경우 0) 조건이 재귀 만족 무효 아니다 85 @ 즉, 레이어 상태는 실제로 상속하고, 발생 이후보다 나중에 오는 86 IF (! P는 [I]가 [좌측] = 0 - && 왼쪽 array_ [I]는> = 0 ) (87) { 88 COUT << [N-] << array_ " " ; 89 SUM = + doPrint을 (P, I, 왼쪽), 90 } 91 } 92 } 93 리턴 ] SUM 94 95 } 96 97 INT 주 () 98 { 99 // 선형 프로그래밍, 그리고 다양한 단계 계획 구매에 출력한다 (100) // M 쇼핑 카드의 번호를, 케이크를위한 초기 값을 array_ 101 INT N- = 0 ; 102 INT ** P = 시험 (N-) 103 INT의 최대 = 0 ; 104 // 최대 값 검색 (105)을 위해 ( INT I = N-- 1. , I> = 0 , 난 - ) 106 { 107 대 ( INT J = M, J> = 1. , J, ) (108) { 109 IF (P [I] [J]) 110 { 111 최대 = P [I] [J] 112 체류 ; 113 } 114 } 115 만약 (최대) 체류 ; 116 } 117 COUT << " ----------------------------- " << ENDL; 118 INT의 합 = 0 ; (119) 에 대한이 ( int로 - N I = 1 , I> = 0 난 -; ) 120 { 121 합계 + = doprint를 (P, I, 최대); 122 } 123 COUT << " 있다 " << << SUM " 종 법 구매 " << ENDL; 124 COUT은 << " 의 최대 교하여 통합 될 수있다 " << 최대 << ENDL 단계; 125 (126) }