만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

배낭 문제

시간 제한3초메모리 제한512 MB

요약
n개 물건의 무게와 가치, 그리고 용량 W가 주어질 때 총 무게가 W를 넘지 않는 부분집합의 가치 합의 최댓값을 구합니다.
난이도

보통10점 중 7점

유형
동적 계획법, 그리디, 정렬
정답자
아직 제출이 없습니다

문제

아래 배낭 문제를 푸시오. 무게는 무작위 필터로 평활화되어 있습니다.

To fit the best stuff in a sack with limits on what you can pack recursion will do if memoized too but DP puts less on the stack.

nn개의 원소 (w_1,v_1),…,(w_n,v_n)(w\_1, v\_1), \dots, (w\_n, v\_n)과 용량 WW가 주어진다. 다음 값을 구하라.

max⁡_S⊆\[n]∑_i∈Sw_i≤W∑_i∈Sv_i.\max\_{\substack{S \subseteq \[n]\\\\\sum\_{i\in S} w\_i \leq W}} \sum\_{i \in S} v\_i\text{.}

여기서 \[n]\[n]은 1부터 nn까지의 정수 리스트이다.

0≤n≤5000 \leq n \leq 500, 0≤w_i≤W≤10170 \leq w\_i \leq W \leq 10^{17}, 0≤v_i≤10160 \leq v\_i \leq 10^{16}을 만족한다고 보장한다. 또한 무게 w_iw\_i는 아래 설명대로 평활화되어 있다고 보장한다.

먼저 위 제약을 만족하는 인스턴스를 만든다. 그다음 무작위 필터를 적용한다. BB를 원소 중 가장 큰 무게라고 하자. 각 무게는 다음과 같이 갱신된다.

w_i←min⁡(w_i+\mboxrand(⌊.05B⌋),W)w\_i \leftarrow \min (w\_i + \mbox{rand}(\lfloor .05 B \rfloor), W)

여기서 \mboxrand(A)\mbox{rand}(A)는 [0,A−1][0, A-1] 범위의 균등 난수 정수를 돌려준다. 이 필터는 w_iw\_i에만 적용되며 WW나 다른 값은 바꾸지 않는다.

입력

첫 줄에 두 정수 nn과 WW가 공백으로 구분되어 주어진다. 이어지는 nn개의 줄에는 각각 두 정수 w_iw\_i와 v_iv\_i가 공백으로 구분되어 주어진다. 무게는 위에서 설명한 방식으로 만들어진다. 먼저 제약을 만족하는 인스턴스를 고르고, 그 뒤에 평활화를 적용한다. 프로그램이 입력으로 받는 값은 평활화를 거친 결과이다.

출력

주어진 배낭 문제의 값을 한 줄에 출력하라.

예제2

  1. 예제 1

    입력
    3 5
    1 2
    2 3
    3 4
    
    예상 출력
    7
    
  2. 예제 2

    입력
    3 302000
    100588 2
    200421 1000
    30036 1
    
    예상 출력
    1002