HDU - 1114 (전체 배낭, 바로 작성)

돼지 저금통

ACM 아무것도 할 수하기 전에 예산 준비 및 획득에 필요한 재정 지원을해야합니다. 이 작업의 주요 수입은 비가 역적 바운드 돈 (IBM)에서 비롯됩니다. 아이디어는 뒤에 간단합니다. 일부 ACM의 회원이 어떤 작은 돈을 가지고 때마다, 그는 모든 동전 소요와 돼지 저금통에 그들을 던졌습니다. 당신은이 과정이 돌이킬 수없는 것을 알고, 동전은 돼지를 파괴하지 않고 제거 할 수 없습니다. 충분히 긴 시간 후, 지불해야 할 모든 것을 지불하는 돼지 저금통에 충분한 현금이 있어야한다. 

그러나 돼지 - 은행에 큰 문제가있다. 내부에 얼마나 많은 돈을 확인할 수 없습니다. 그래서 우리는 충분한 돈이없는 것을 알아 조각으로 돼지를 깰 수 있습니다. 분명히, 우리는이 불쾌한 상황을 피하고자합니다. 유일한 가능성은 돼지 저금통의 무게와 동전 안에 얼마나 많은 추측하는 것입니다. 우리가 정확히 돼지의 무게를 결정할 수 있음을 우리는 주어진 통화의 모든 동전의 무게를 알고 있다고 가정합니다. 그리고 우리가 보장 할 수있는 돼지 저금통에 돈의 일부 최소 금액이 있습니다. 당신의 작업은이 최악의 경우를 발견하고 돼지 은행 내부 현금의 최소 금액을 결정하는 것입니다. 우리는 당신의 도움이 필요합니다. 더 이상 조기 돼지 깨진 없습니다! 

InputThe 입력은 T 테스트 케이스로 구성되어 있습니다. 이들의 수 (T)는 입력 파일의 첫 번째 줄에 주어진다. 각각의 테스트 케이스는 그들은 빈 돼지의 동전으로 가득 돼지의 무게를 나타내는 선은 두 개의 정수 E와 F를 포함하는 시작한다. 모두 무게는 그램에 제시되어있다. 이상 10kg 체중이 더 돼지, 즉 1 <= E는 <= F는 <= 10000 테스트 케이스의 두 번째 행에 번호를 부여 정수 N (1 <= N <= 500)가 의미 주어진 통화에 사용되는 다양한 동전. 이 다음 N 라인, 각 지정하는 하나 개의 동전 유형과 동일합니다. 이 선은 두 정수 각각 PAND W를 (1 <= P <= 50000, 1 <= W <= 10000) 함유한다. P는 화폐 단위의 동전의 값, W는 그램 무게의입니다. 
각 테스트 케이스에 대한 출력 단 하나 개의 라인을 OutputPrint. "돼지 저금통에 돈의 최소 금액은 X.이다"행은 문장을 포함해야 여기서 X는 주어진 총 중량에 동전을 사용하여 달성 될 수있는 돈의 최소량이다. 무게가 정확히 도달 할 수없는 경우, "이것은 불가능하다."선을 인쇄 할 수 있습니다.
샘플 입력

3 
10 110 
2 
1 1 
30 50 
10 110 
2 
1 1 
50 30 
1 6 
2 
10 3 
20 4

샘플 출력

상기 돼지 - 은행에 돈의 최소 금액은 (60)은 IS 
(100)에서 돼지 - 은행에 돈의 최소 금액에서 IS 
이 불가능합니다. 

그것은 완전히 벌거 벗은 배낭 문제입니다. 그러나 여기 최소 요구 사항입니다. . . 그런 다음 초기화 시간이 INF 설정할 수 있습니다. 그런 다음 초기 상태 0.
전체 배낭 : 그냥 그렇지 않으면 0으로 초기화 할 수 INF에 초기화 입력합니다.
코드 :
<. 비트 / stdc ++ H> #INCLUDE
 #DEFINE의 디버그 (X) COUT << "["<< #x를 << ""<< (X) << "]"<< ENDL
 #DEFINE PII 쌍 <INT, INT>
 #DEFINE CLR (a, b)가 memset ((a), B는 sizeof (a))
 #DEFINE의 담당자 (난, A는 B)의 경우는 (INT 나는 A =; 나는 B를 <; 내가 ++)
 # 정의 PB와 push_back
 #DEFINE MP가 make_pair
 #DEFINE LL 긴 긴
 #DEFINE의 ULL 부호 LL의
 #DEFINE의 LS I << 1
 #DEFINE RS (I << 1) + 1
 #DEFINE INT (t) INT t; scanf와 ( "%의 D", t) 를 사용 스페이스 성병; CONST INT INF = 0x3f3f3f3f ;
CONST의 INT

 

  maxn = 600 ;
INT의 DP [ 10010 ];
INT w [maxn], H [maxn]; 

INT 의 main () {
     INT의 t; scanf와 ( " %의 D " , t);
    동안 (t - ) {
         INT의 E, F; scanf와 ( " % d 개 %의 D ' , E, F);
        INT TOT = F - E;
        INT의 N; scanf와 ( " %의 D ' , N);
        위한 ( int로 I = 1 ; i가 <= N; ++ I) 
            는 scanf를 (" %의 D % d에 " , w [i]는, H [I]); 
        CLR (DP, INF); 
        DP [ 0 ] = 0 ;
        위한 ( int로 I = 1 ; i가 = N <; ++ I)
              ( INT의 j 개의 = h를 [I] J <= TOT; ++ j)의 
                DP [J] = 분 (DP [J], DP [J - H [내가] + w [I]);
//         디버그 (DP [TOT]); 
        경우 (DP [TOT] == INF) 
            COUT << " 이 불가능하다. " << ENDL;
        다른 
            COUT <<" 돼지 뱅크 돈의 최소량은 " << DP [TOT] << " . " << ENDL; 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/rookie-acmer/p/11258298.html