1,068 찾기 더 많은 동전 (30point (들)) 두 브러쉬 * 01 배낭 문제 동적 프로그래밍을 필요로

기본적인 아이디어 :

전형적인 01 배낭 문제;

 

요점 :

요약에 따라;

 

사용법 #include <iostream> 
#INCLUDE <stdlib.h> 
#INCLUDE <STDIO.H> 
#INCLUDE <벡터>  
#INCLUDE < 문자열 > 
#INCLUDE <math.h> 
#INCLUDE <알고리즘> 
#INCLUDE <CString을> 
#INCLUDE <맵 > 
#INCLUDE <큐> 
#INCLUDE < 설정 > 
#INCLUDE <적층>
 사용  스페이스 성병; 

CONST  INT maxn = 10010 ; 

INT의 N, m;
INT의 VEC [maxn];
int로 [maxn] DP;
부울선택 [MAXN] MAXN] 

BOOL CMP ( INT의 A, INT B) {
     복귀 A> B] 
} 

INT (주) { 
    CIN >> N- m;
     // INT a 및 
     ( INT I = 1이다. ] I <= N-; I ++ ) { 
        CIN >> VEC [I]; 
    } 
    정렬 (VEC + 1. , N- + + VEC 1. , CMP);
     // 초기화 배열 DP;
     // 용량 / 값 m 대응한다 
     ( INT I는 = 0 ; I는 <= m; I ++는) {
         // 방전 소자를 나타낸다 전에 0 보류가 0이어야하지 않는다 
        DP [I] = 0 ; 
    } 
     ( INT I = 1. ; I <= N-; I ++ ) {
         // 개시 전에 제 n 요소 순환으로, 
         ( INT의 -; V> VEC = [I] V V = m ) {
             // 배치하면, 
            IF (DP [V] <DP = [V - VEC [I] + VEC [I]) {
                 //이 더 배치하는 경우, 
                선택은 [I] [V]는 = . 1 ; // 주제 배치 
                DP [V]를 최대 (DP = [- VEC [I] V] + [V], DP를 VEC [I]) // 또는에 배치되지; 
            }
            다른 { 
                선택 [I] [V] = 0 ; // 주제 배치되지 
            } 
        } 
    } 
    IF (DP [m]! = m) {
         // 최적의 솔루션을 생성하지 않으면, 
        COUT << " 해결책 " << ; ENDL 
    } 
    다른 {
         // 경우 최적의 수용액; 
        INT K = N-, NUM = 0 , V = m;
         BOOL 에서 플래그 = true로 ,
         그동안 (K> = 0 ) {
             IF (선택 [K] [V] == (1)) {
                 // 进行选择, 
                경우 (플래그) { 
                    COUT << VEC [K]; 
                    플래그 = 거짓 ; 
                } 
                다른 { 
                    COUT << "  " << VEC [K]; 
                } 
                V - = VEC [K]; 
            } 
            케이 - ; 
        } 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/songlinxuan/p/12357908.html