동적 프로그래밍 --01 배낭

돌려  https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html를

문제 설명 : 항목을 n 개의있다, 그들은 어떻게 배낭에 항목 합계의 최대 값을 가지고 얻을 수있는 배낭, 기존의 용량을 제공, 자신의 무게와 가치가?

동적 프로그래밍 및 프로세스의 세 번째 원칙 :

  예 : 수 = ​​4, 용량 = 8

나는

1

4

w (부피 기준)

4

5

V (값)

4

5

6

      V (I, J)의 정의 : 배낭 J의 전류 용량이 상기 문서에 대응하는 값의 i 번째 이전 최상의 조합;

   재발의 관계를 보면, 상품의 얼굴은 두 가지 가능성이있다 :

    우선, 패킷의 용량은 제품의 부피보다 작은, 착용감이 때 이전 I-1 번째의 키의 값은 동일하다, 즉, V (I, J) = V (I-1, J);

    둘째로, 생성물을 저장할 수있는 충분한 용량이 존재하지만, 반드시 설치하지 최적의 전류 값에 도달하므로, 적재 된 및 적재되지 즉 V (I, J) = {V 최대의 최적 선택 (I-1, J), V (I-1, JW (I)) + V (I)}

       V는 (I-1, j)에로드되지 나타내고, V (I-1, JW (I)) + V (i)가 설치되어, i 번째의 상품이고, 배낭 용량 w (i)를 감소하지만, 값 (V 증가 I);

    그것은 재발의 관계를 다음과 같습니다 :

    1)  J <w (I)       V (I, J) = V (I-1, J)

    2)  J> = w (I)      V (I, J) = 최대 { V  (I-1, J) , V (I-1, JW (I)) + V (I)  }

  시트는 제 경계 조건, V (0, J)를 V = (I 0) = 0으로 초기화하고;

 

  H)과 그 다음 라인으로 라인 형태로 작성

    1), I = 1, J = 1, 1 = 2, V (1) = 3, 거기 승 J <w (1), 그래서 V (1,1) = V (1-1,1) = 0;

    2) 다른 실시 예 I = 1, J = 2, w (1) = (2), V (1) = 3있다 J = w (1), 즉 V (1,2) = {V 맥스 (1-1 그래서 2), V (1-1,2-w (1)) + V (1)} = {0,0 최대 + 1} = 3;

    3) 이러한 상황에서, w (4) = 5 (V) (4) = 6있다 J w 마지막으로, I = 4, J = 8> 채우기 위해 (4), 그래서 V (4,8) = 최대 { V (4-1,8), V (4-1,8-w (4)) + V (4)} = 최대 {9,4} + 6 = 10, 그래서 다음과 같이 테이블이 완료된 :

 

코드를 복사
동적 프로그래밍 1 공극 FindMax () // 
 2 { 
 . 3 INT의 I, J] 
 . 4 // 시트 
 5. (I = 1]. I는 <= 수, I는 ++) 
 6 {. 
 (J 용 = 7 1;.. J <= 용량; ++ J) 
 (8) {. 
 9 IF (J <W [I]) // 아니라 패키지로. 
10 { 
11 V [I] [J] = V [1-I.] [J]. 
12이다} 
13 설치할 수있는 다른 // 
14 { 
15의 경우 (V [I-1 ] [J]> V는 [I-1] [JW는 [내가] + V는 [I]) // 없는 큰 값 수단 
(16) { 
. 17 V [I] [J] = V [ I-1] [J] 
18된다} 
. (19)와 I-1 번째 전에 물품의 i 번째 항목의 다른 // 최적 값보다 
20는 { 
21 V 인 [I] [J] = V [I- 1] [JW [I] + V [I]; 
22} 
23} 
24} 
25} 
26}
코드를 복사

  ⅰ) 폼을 완료하는 데, 즉, 최적의 솔루션이 솔루션 이루어지는 어떤 제품이 때문에 최적해 되돌아에 따른 조성물에 대한 해결책을 찾기 위해, 알려져 있지 V (번호, 용량) = V (4,8) = 10, 충전의 원칙에 따라하는 것은 다음과 같은 해결책을 찾기 위해 할 수 있습니다 :

    1) V (I, J) = V (I-1, i 번째의 상품이 선택되지 J)는, 설명, V (I-1, J)로 되돌아 간다;

    2) V (I, J) = V (I-1, JW (I)) + 실시간 V (i)는, 상기 장치는, i 번째의 상품 설명, 상품이 최적의 솔루션의 부분으로 구성되어, 우리는 반환해야 제품, 즉 다시 V 행 (I-1, JW (I))를 로딩하기 전에;

    3) 모든 솔루션 구성된 끝까지 I = 0으로 이송되어 발견된다.

  예로서 J)

    1) 최적해 V (4,8) = 10, 및 V (4,8)! = V (3,8)이있다 V (4,8) = V (3,8-w (4)) 절 + (4) = V (3,3) + 6 = 4 네 번째 항목이 선택되고, 그래서 = 10 + 6, 다시 V에 (3,8-w (4)) = V (3,3) ;

    2) V (3,3) = V (2,3) = 4 번째 항목이 선택되지 않도록, 다시 V (2,3)에;

    3) V (2,3)! = V (1,3)이있다 V (2,3) = V (1,3- w (2)) + V (2) = V (1,0) + = 4 번째 항목이 선택되도록 (4) = 4 + 0, 다시 V에 (1,3- w (2)) = V (1,0);

    4) V (1,0) = V (0,0) = 0 인 첫 번째 항목이 선택되지 않도록;

 

  이에 K) 01 배낭 문제는이 문제에 대한 동적 프로그래밍 솔루션을 사용함으로써 해결되었다이 효율의 효율, 즉, 테이블을 작성한다, 그래서 동적 프로그래밍의 시간 효율이 때문에에, O (번호 * 용량) = O (n 개 * 온도)이고 문제의 메모리 서브 용액의 2 차원 배열을 사용하므로, 동적 프로그래밍의 공간 효율 (N *의 온도) O이고;

코드를 복사
1 공극의 FindWhat는 INT (I, INT J) // 찾기 용액 조성물 실시 예 
 2 { 
 . (3) IF (I> = 0) 
 . (4) { 
 . 5 IF (V [I] [J] == V의 [. 1-I] [J] ) // 동일하지 기재된 장치 
 . (6) { 
 . 7 아이템 [I]는 = 0; // 글로벌 변수 표시가 선택되지 
 . 8의 FindWhat (1-I, J). 
 . (9)} 
(10) 그 밖의 IF (JW [I]> = 0 && V는 [I]를 [J]를 == V는 [. -I 1] [JW [I] + V [I]) 
. 11 { 
12 아이템 인 [I] = 1;. 태그가 선택 // 
13의 FindWhat을 (I-1, JW가 [I]) 번들 이전 위치로 복귀 // 
14} 
15} 
16}
코드를 복사

3, 공간 최적화

  l) 최적화 된 공간은 각 값 V (I) (j)가 V 만 변경 (I-1) ~ (X) {X : 1 ... J} 관련이 V (I-1) (x)의 전면은 다운 사이클 내가 값을 저장;

  공간을 최적화하는 목적을 수행하기 때문에, V는 1 차원 배열로 감소 될 수 있고, 상태 천이 방정식으로 변환된다  B (J) = 최대 {B (J), B (JW (I)) + V (I)} ;

  일차원 배열 J 내림차순으로 스캔 할 있도록 또한, 상태 천이 방정식 V (I-1) (JW (I))에 의해 각각의 유도 V (I) (j)가 도출된다 (용적 ) 0, 하나 개의주기는 이전 에러의 결과, 그 값이 수정 될 것인지 보존.

 

  m)는 마찬가지로 상기 예는 I = 3에 대하여 설명한다있다 :

    1) 나는 = 3, J = 8 (3), 则의 B (8) = 최대 {B (8), B를 (8 w w (3) = 4, V (3) = 5, 有의 J> w (3)) + V (3)} = {최대 B (8), B (4) +5} = 최대 {7,4} + 5 = 9;

    2) J- -, J = 7, J 즉있다> (3) 다음, B (7) = 최대 {B (7), B (7 w (3)) + V (3)} = 최대 {B w (7) B (3) +5} = 최대 {7,4} + 5 = 9;

    3) J- -, J = 6, J 즉있다> (3) B (6) = 최대 {B (6), B (6-w (3)) + V (3)} = 최대 {B w (6), B (2) +5} = 최대 {7,3} + 5 = 8;

    4) J- -, J = 5, J 즉있다> (3) 다음, B (5) = 최대 {B (5), B (5 w (3)) + V (3)} = 최대 {B w (5), B (1) +5} = 최대 {7,0} + 5 = 7;

    5) J- -, J = 4, 즉 존재 J = (3) 다음, B (4) = 최대 {B (4), B (4-w (3)) + V (3)} = 최대 {B w (4), B (0) = 최대 +5} {4,0} + 5 = 5;

    6) J- - 즉, J = 3있다 (3)의 배열 범위를 액세스하기 위해이 계속 승 J <라운드 동작을 정지하고, B (0)의 값을 B로 (3), 상부 고정 루프 (의 I = 2 내가 ++ 다음주기에 변경되지 않는 값);

 

  如果j不逆序而采用正序j=0...capacity,如上图所示,当j=8时应该有B(8)=B(8-w(3))+v(3)=B(4)+5,然而此时的B(4)已经在j=4的时候被修改过了,原来的B(4)=4,现在B(4)=5,所以计算得出B(8)=5+5=10,显然这于正确答案不符合;所以该一维数组后面的值需要前面的值进行运算再改动,如果正序便利,则前面的值将有可能被修改掉从而造成后面数据的错误;相反如果逆序遍历,先修改后面的数据再修改前面的数据,此种情况就不会出错了;

코드를 복사
 1 void FindMaxBetter()//优化空间后的动态规划
 2 {
 3     int i,j;
 4     for(i=1;i<=number;i++)
 5     {
 6         for(j=capacity;j>=0;j--)
 7         {
 8             if(B[j]<=B[j-w[i]]+v[i] && j-w[i]>=0 )//二维变一维
 9             {
10                 B[j]=B[j-w[i]]+v[i];
11             }
12         }
13     }
14 }
코드를 복사

 然而不足的是,虽然优化了动态规划的空间,但是该方法不能找到最优解的解组成,因为动态规划寻找解组成一定得在确定了最优解的前提下再往回找解的构成,而优化后的动态规划只用了一维数组,之前的数据已经被覆盖掉,所以没办法寻找,所以两种方法各有其优点。

 

추천

출처www.cnblogs.com/Lemon1234/p/11620691.html