가방 9 강의 01 가방 문제
질문 설명:
현재 n 개의 물품 이 있 는데 그 중에서 i 개의 물품 의 무 게 는 w [i] 이 고 가 치 는 p [i] 이 며 1 개의 용량 이 v 인 가방 이 있 습 니 다. 가방 의 용량 을 초과 하지 않 는 상황 에서 얻 은 상품 의 가 치 를 합 쳐 최대 로 해 야 합 니 다.
문제 분석:
우선, 어떤 선택 전략 을 취하 더 라 도 이 n 개의 상품 은 두 가지 가 발생 하고 두 가지 상태 만 발생 하 며 취하 거나 취하 지 않 을 수 있 습 니 다. 먼저 물품 의 총량 n = 1, 즉 하나의 물품 만 있다 고 가정 하면 최대 가 치 를 얻 으 려 면 두 가지 상황 으로 나 뉜 다. 하 나 는 가방 용량 이 이 상품 의 무게 보다 작 지 않 으 면 취한 다.둘째, 가방 용량 이 이 상품 의 무게 보다 적 으 면 포기 합 니 다. 현재 n = 2 를 가정 하고 모든 전략 을 매 거 하 는 방법 을 사용 하면 모두 네 가지 전략 을 얻 을 수 있다. 1 을 취하 든 2 를 취하 든 1 을 취하 지 않 든 둘 다 취하 든 둘 다 취하 지 않 든. 그러나 n 의 수치 가 비교적 크 면 매 거 진 형식 으로 모든 결 과 를 열거 하기 어렵 기 때문에 이 때 는 하나씩 고려 할 수 있다.n 번 째 물품 부터 물품 의 두 가지 상 태 를 고려 하여 첫째, n 번 째 상품 을 취 할 때 문 제 는 n - 1 번 물품 에서 일정한 수량의 물품 을 선택 하여 용량 이 v - w [n] 인 가방 에 넣 고 가방 용량 을 초과 하지 않 는 전제 에서 가장 큰 가 치 를 해결 하 는 것 으로 간략화 되 었 다. 우리 가 요구 하 는 문 제 는 간략화 된 문제 의 해결 에 n 번 째 물품 의 가 치 를 더 하 는 것 이다.둘째, n 번 째 아 이 템 을 포기 할 때 문 제 는 n - 1 번 아 이 템 에서 일정한 수량 을 선택 하여 용량 이 v 인 가방 에 넣 는 것 으로 간략화 되 었 다. 가방 용량 을 초과 하지 않 는 상황 에서 가장 큰 가 치 를 가진다. 이때 간략화 한 문제 의 해 는 바로 우리 가 요구 하 는 최종 적 인 해결 이다. n 번 째 를 고려 한 다음 에 같은 방식 으로 n - 1 번, n - 2 번 을 고려 합 니 다. 마지막 을 고려 할 때 까지 가방 이 두 번 째 물건 부터 n 번 째 물건 까지 일정한 상품 을 선택 한 상황 에서 가방 의 남 은 용량 이 첫 번 째 물건 (즉, 우리 가 마지막 으로 고려 한 물건) 을 놓 을 수 있다 면 우 리 는 찾 고 놓 지 못 하면 버 릴 것 이다.
알고리즘 설계
f [i] [v] 를 사용 하여 이전 i 개 아 이 템 중 일 부 를 골 라 v 용량 의 가방 에 넣 는 것 이 가장 큰 가치 라 고 밝 혔 다. 자세히 분석 해 보면 f [i] [v] 는 f [i - 1] [v - w [i] + p [i] 와 f [i - 1] [v] 의 최대 치, 즉 f [i] = max (f [i - 1] [v - w [i]]] + p [i], f [i - 1] [v]) 와 같다. 이것 을 분석 하면 이것 은 매우 뚜렷 한 귀속 문제 라 는 것 을 얻 기 어렵 지 않다. 여기 서 주의해 야 할 점 이 있 습 니 다. 제목 에 가방 을 가득 채 우 는 것 이 아니 라 가방 용량 을 초과 하지 않 는 상황 에서 실제 사용 하 는 가방 용량 은 v 일 수도 있 고 v - 1, v - 2 심지어 0 일 수도 있 기 때문에 f [i] [v] 는 f [i] [v - 1] 과 같 을 수도 있 고 f [i] [v - 2] 와 같 을 수도 있 습 니 다. 심지어 f [i] [0] 은 실제 상황 에 따라 정 해 집 니 다.만약 에 이 n 개의 물품 의 무게 가 가방 의 총 용량 보다 크다 면 f [i] [v] 는 f [i] [0] 과 같다.
자바 구현
public class Page1 {
private static int w[] = {2, 2, 2, 3, 5, 1, 3, 2, 7, 4, 2, 6};//
private static int p[] = {4, 4, 4, 6, 4, 1, 3, 8, 2, 1, 2, 4};//
private static int v = 7;
public static void main(String[] args) {
System.out.println(fun(w.length - 1, v));
}
public static int fun(int i, int v){
if(i < 1){
// i=0 , ,
if(v >= w[i]){
return p[i];
}else{
return 0;
}
}else{
if(v < w[i]){
// ,
return fun(i - 1, v);
}else{
//
return fun(i - 1, v) > fun(i - 1, v - w[i]) + p[i]?fun(i - 1, v):fun(i - 1, v - w[i]) + p[i];
}
}
}
}
이상 은 제 가 01 가방 에 대한 간단 한 이해 입 니 다. 부족 한 점 이 있 으 면 지적 해 주 십시오.미 완성 계속...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【JavaScript】 볼록함 그라함 스캔을 구현, 애니메이션화한다! ? 【canvas】볼록포를 시각화해 본다. — s-yoshiki | 스크립트 카스 (@s_yoshiki_dev) JavaScript에서 그레이엄 스캔에 의해 정렬되어 가는 애니메이션을 구현했다. 아래쪽에서 데모로 소개. 참고 Java...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.