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 ; }