동전 (복수 배낭)

Whuacmers는 coins.They 값 A1, A2, A3 ... Silverland 달러의 동전을 사용합니다. 어느 날 Hibix는 지갑을 열어 어떤 동전이 있었다 발견했다. 그는 근처의 가게에서 아주 좋은 시계를 구입하기로 결정했다. 그는 (변경 없음) 정확한 가격을 지불하고 싶어 그는 가격이 아닌 더 m.But 이상의 그는 시계의 정확한 가격을 알고하지 않은 것입니다 알려져 있습니다.

그런 다음 값 A1, A2, A3 ... 토니의 동전의 수에 대응하는 N m, A1, A2, A3 ...는 AND C1, C2, C3 ... cn이 판독 프로그램을 작성한다 토니는 사용에게이 동전을 지불 할 수있는 얼마나 많은 가격 (m에 양식 1) 계산합니다.

InputThe 입력은 여러 테스트 케이스가 포함되어 있습니다. 각 테스트 케이스의 첫 번째 라인은 국지적 번째 줄은 A1, A2, A3 ... AN, C1, C2, C3를 나타내는 2N 정수를 포함 두 정수 N (1 ≤ N ≤ 100) m (m ≤ 100,000)을 포함한다. ..Cn (1 ≤ ≤ 아이 100000,1 CI ≤ ≤ 1,000). 마지막 테스트 케이스가 테스트 케이스 출력 zeros.OutputFor 두 번의 line.Sample 입력에 응답 뒤에

10 3 
1 2 4 2 1 
2 5 
1 2 4 1 
0 0

샘플 출력

8 
4
사용법 #include <iostream> 
#INCLUDE <CString을>
 사용  스페이스 성병;
CONST  INT maxn = 100010 ;
int로 [maxn] DP;
int로 주 () 
{ 
    INT의 N, m을;
    int로 [maxn]을 A [maxn, B 단계;
    INT의 합 [maxn]; // 每个硬币出现次数
    동안 (CIN N >> >> N && && m m) 
    { 
        memset 함수 (DP, 0 , 는 sizeof (DP));
        위한 ( INT 난 = 0 ; I <N; I ++ ) 
           CIN >> A [I];
        위한 ( INT 난 = 0 ; I <N; I ++ ) 
           CIN >> B [I]; 
        DP [ 0 ] = 1 ;
        INT ANS = 0 ;
        위한 ( INT 난 = 0 ; I <N; I ++ ) 
        { 
            memset 함수 (합계 0 , 는 sizeof (합));
             ( INT J = A [i]를, J <= m; J ++ ) 
            { 
                경우 (! DP [J] && DP [JA [I] && 합 [JA [I] < B [I]) 
                { 
                    DP [J]= 1 ; 
                    합 [J] = 합계 [JA [I] + 1 ; 
                    ANS ++ ; 
                } 
            } 
        } 
        COUT << ANS << ENDL; 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/ylrwj/p/11945416.html