PAT (고급 레벨) 연습 1,068 찾기 더 많은 동전

문제 해결

  01 + 배낭 보드 녹화 경로. 경로는 오히려 전용 레코드로부터 검색된 멀티 솔루션 구성 가능한 작은 값의 경화에 의한 솔루션의 집합이다. 1 차원 배열로, 경로를 사용하여 기록 될 수 없음 [중량 현재 = 문서 번호, 마지막에 기록 된 준수 여부가 해결 될 수 있기 때문이다. 이 기록 경로의 2 차원 배열이되도록, 경로 [부품 번호] [현재의 중량] = 1이므로 솔루션 레코드의 다수의 세트가 될 수있다. 시간이 솔루션의 최소 세트를 발견하는 데 필요한의, 그래서 01 배낭을 용이하게하기 위해, 첫 번째 동전 내림차순를 가지고 있기 때문에, 당신은 솔루션을 내림차순으로 업데이트 할 수 있습니다.

코드

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
INT (DP) [ 150 ], 동전 [ 10005 ]로 [ 10005 ] [ 150 ];
값 int ) (주 
{ 
    INT I, J, N, M, 인덱스; 
    벡터 < INT > ANS; 
    scanf와 ( " % D % D " , N, M);
     (ⅰ = 1 ; I <= N; I ++ )     
        는 scanf ( " %의 D " , 코인 [I]); 

    정렬 (코인 + 1 코인 + N + 1큰 < INT > ()); 

    대해 (ⅰ = 1 ; I <= N은, I ++ ) 
    { 
        대한 (j = M, J> = 코인 [I] j-- ) 
        { 
            경우 (DP [J] <= DP [J 코인 [I]는 + 코인 [내가]) 
            { 
                DP [J] = DP [J 코인 [I] + 코인 [I]; 
                경로 [I] [J] = ; 
            } 
        } 
    } 
    
    인덱스 = N은;
    경우 (DP [M] == M) 
    { 
        동안 (M) 
        { 
            경우 (경로 [N] [M]) 
            {
               ans.push_back (코인 [N]); 
               M - = 코인 [N]; 
            } 
            N - ; 
        } 
        종류 (ans.begin (), ans.end ()); 
        대해 (ⅰ = 0 ; 나는 <ans.size (); I ++ ) 
            의 printf ( " % D % C " , ANS는 [I] I ans.size == () - 1 ? ' \ n ' : '  ' ); 
    } 
    다른 사람 
        의 printf ( " 해결책 \ n을 " ); 

    시스템 ( " 정지 " );
    반환 0 ; 
}

추천

출처www.cnblogs.com/VividBinGo/p/12232673.html