알고리즘 - 가방 문제
8600 단어 알고리즘
가방 문 제 는 동태 계획 에서 비교적 전형 적 인 문제 형 으로 대체적으로 3 가지 01 가방, 완전 가방 과 다 중 가방 으로 나 눌 수 있다.
가방
질문 설명:
n 가지 아 이 템 이 있 습 니 다. 각각 1 개 만 있 습 니 다.제 i 중 아 이 템 의 부 피 는 v i vi vi, 무 게 는 w i wi wi。일부 물품 을 선택 하여 용량 이 C 인 가방 에 넣 으 면 가방 안의 물품 의 총 부피 가 C 를 초과 하지 않 는 전제 에서 무 게 는 가능 한 한 크다.
2 차원 해법
가장 간단 한 사 고 는 두 개의 상태 dp [i] [j] 를 사용 하여 i 개의 아 이 템 을 담 았 을 때 부피 가 j 인 상황 에서 얻 을 수 있 는 최대 무 게 를 나타 내 는 것 이다.상태 이전 은 다음 과 같 습 니 다: dp [i] [j] = max (dp [i - 1] [j], dp [i - 1] [j - v [i]] + w [i]) 즉 제 i 개 아 이 템 과 같이 장 착 하거나 제 i 개 아 이 템 을 불 러 오지 않 으 면 얻 는 무게 의 비교적 큰 값 입 니 다.
for i in range(1, n+1):
for j in range(C+1):
if v[i] < j:
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + w[i])
일차 해법
2 차원 해법 에서 의 전이 방정식 에 따라 발송 할 수 있 습 니 다. i 번 째 아 이 템 에 장 착 할 때 얻 을 수 있 는 최대 무 게 는 i - 1 에 장 착 할 때 만 관련 되 기 때문에 상태 압축 dp [j] = max (dp [j], dp [j - v [i]] + w [i]) 를 진행 할 수 있 습 니 다.
for i in range(n):
for j in range(C+1):
if v[i] < j:
dp[j] = max(dp[j], dp[j - v[i]] + w[i])
완전 가방
질문 설명:
01 가방 과 유사 하지만, 각 종류의 아 이 템 은 무한 개
해결 방안
상태 이동 방정식 은 01 가방 과 같 습 니 다: dp [j] = max (dp [j], dp [j - v [i]] + w [i])
for j in range(C+1):
for i in range(n):
if v[i] < j:
dp[j] = max(dp[j], dp[j - v[i]] + w[i])
욕심
완전 가방 문제 에서 개수 의 제한 이 없 기 때문에 우 리 는 먼저 밀 도 를 계산 하고 밀도 가 높 은 물건 을 우선 선택 하면 된다. 이렇게 복잡 도 는 동태 계획 보다 훨씬 작다.
3. 다 중 가방
질문 설명:
다 중 가방 은 완전 가방 에 수량 제한 을 더 한 것 으로, i 종 아 이 템 의 수량 은 n i n 입 니 다.i ni
해결 방안
해결 방법 은 완전 가방 과 비슷 합 니 다. 옮 겨 다 닐 때 남 은 물건 이 있 는 지 판단 하면 dp [j] = max (dp [j], dp [j - v [i]] + w [i])
for j in range(C+1):
last = -1
for i in range(n):
if v[i] < j and n[i]:
if dp[j] < dp[j - v[i]] + w[i]:
dp[j] = dp[j - v[i]] + w[i]
last = i
if last:
n[i] -= 1
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.