DP 백팩 매듭(2)(구조가 완전하고 내용이 간결하며 상태 방정식 편)

4317 단어 dp배낭.
0 가방 소결 2, 이하 상태 이동 코드, 모든 관련 변수와 수조가 초기화되었다고 가정하고 물품에 대응하는 부피와 가치는 아래에 1로 표시된 수조부터 저장한다. dp[] 또는 dp[][]는 각 상태의 가방에 장착된 물품의 총 가치이다.
아래에 완전한 가방 모형을 사용한 경우 한 단계 최적화를 할 수 있고volume[i]value[j]를 만족시키는 i와 j 물품을 모두 선별하여 무작위로 생성된 데이터에 부합되지 않는 많은 물품을 삭제할 수 있습니다.
101 가방(가방 총 수용 bag, type 종류 아이템 있음, 각 아이템 중 하나만 선택, 놓지 않음, 대응하는 부피 vlume[i], 대응하는 가치value[i]) 제시)
1) 2차원수조(문제를 풀지 않고 충분히 이해하는 것을 권장함)(부피 때문에 넣지 못하는 상태의 값을 잊어버리기 쉽고 마지막으로 v:0->bag를 누비며 최대치를 찾기 쉽기 때문)
//01       
for(int i=1;i<=type;i++){
    for(int j=0;j<=bag;j++){
		if(j>=volume[i]){
			dp[i][j]=max(dp[i-1][j],dp[i-1][j-volume[i]]+value[i]);
		}
		else{
			dp[i][j]=dp[i-1][j];//  
		}
	} 
}
    int maxx=0;
    for(int j=1;j<=bag;j++){
        maxx=max(maxx,dp[type][j]);
    }

//dp[i][j]는 첫 번째 아이템을 선택하거나 놓지 않을 때 가방 용량이 j일 경우 가방 안의 모든 아이템의 가치//2차원 그룹은 1차원 그룹처럼 자동으로 업데이트되지 않기 때문에 첫 번째 아이템을 넣지 못할 경우 dp[i][j]가 이전 아이템이 놓인 후의 상태 dp[i-1][j]를 계승하는 것이지 초기 값을 유지하는 것이 아니다.
2) 1차원 배열
//01       
for(int i=1;i<=type;i++){
	for(int j=bag;j>=volume[i];j--){
		dp[j]=max(dp[j],dp[j-volume[i]]+value[i]);
	}
}
//01배낭, 각 물품은 하나뿐이고 이 물품의 값은 중첩되지 않기 때문에 거꾸로 순서는 지난 블로그 DP 배낭 문제 소결(01배낭, 완전 배낭, 꼭 채우거나 필요하지 않음, 1차원 DP, 2차원 DP)을 보십시오.
HDU2602 누드01 가방
2 완전 가방(가방 총 수용 bag, type 종류 아이템 있음, 각 아이템 무한대, 대응 부피 vlume[i], 대응 가치value[i]) 제시)
//         
for(int i=1;i<=type;i++){	
    for(int j=volume[i];j<=bag;j++){
		dp[j]=max(dp[j],dp[j-volume[i]]+value[i]);
	}
} 
//완전배낭, 각 물품은 무한 여러 개, 이 물품의 값은 중첩할 수 있기 때문에 직접 순서를 정할 수 있다. 전편의 블로그 DP 배낭 문제 소결(01배낭, 완전배낭, 꼭 채우거나 필요없음, 1차원 DP, 2차원 DP)을 참조한다.
HDU4508 완전 누드 백팩
3 다중 가방(가방 총 수용 bag, type 종류 아이템, 각 아이템에 주어진 수량, 대응하는 부피 vlume[i], 대응하는 가치value[i], 대응하는 수량number[i]) 제시)
주의!거꾸로! 
다음 두 가지는 모두 역순으로 모든 물품을 하나만 놓는 특성을 이용한다. 전자는 이 물품을 k번에 하나씩 넣고, 후자는 이 물품을 한 번에 한 번에 1부터 k까지 넣는 개수가 차례로 증가한다.
//    ,    
for(int i=1;i<=type;i++){
	int minn=min(number[i],bag/volume[i]);//  
	for(int k=1;k<=minn;k++){
		for(int j=bag;j>=volume[i];j--){//     ,     
			dp[j]=max(dp[j],dp[j-volume[i]]+value[i]);
		}
	}
}

//주어진 이 종류의 물품 개수가 실제로 저장할 수 있는 이 종류의 물품 최대 수량보다 많은 것을 방지한다(일부 모함수 코드는 여기서 한 걸음 판단한다. 주어진 수량이 가방의 총 용량보다 크면 이 종류의 물품 부피로 얻은 수량을 나누면 이 종류의 물품은 다 찾지 못할 경우 완전 가방으로 전환할 수 있고 그렇지 않으면 01가방으로 전환할 수 있다)
OR
for(int i=1;i<=type;i++){
	for(int j=bag;j>=volume[i];j--){//     ,     
		for(int k=1;k<=number[i]&&(volume[i]*k<=j);k++){//k=0         dp[j],     0  
			dp[j]=max(dp[j],dp[j-volume[i]*k]+value[i]*k);
		}
	}
    }
HDU2191 누드 다중 팩
4차원 비용의 가방 문제(은밀하게 2차원 비용을 나타내는 가방: 때때로 제목은 가방에 최대 x개의 물품을 저장할 수 있다는 것을 설명하는데 이것은 은밀하게 가방의 저장 수량을 나타내는 것도 일종의 비용이다.)(배낭을 여러 개 추가한, 유사한, 수량을 추가하는 단계 순환)
//      (    )     (        )——    
for(int i=1;i<=type;i++){
    for(int j=volume[i];i<=bag_volume;i++){
        for(int l=weight[i];l<=bag_weight;l++){
            dp[j][l]=max(dp[j][l],dp[j-volume[i]][l-weight[i]]+value[i]);
        }
    }
}

OR
//      (    ) 01  (        )——    
for(int i=1;i<=type;i++){		
    for(int j=bag_volume;j>=volume[i];j--){
        for(int l=bag_weight;l>=weight[i];l--){
            dp[j][l]=max(dp[j][l],dp[j-volume[i]][l-weight[i]]+value[i]);
        }
    }
}

HDU2159 누드 2D 가방
5 혼합 가방
상황 조합에 따라 일부 다중 가방은 수량이 충분한 상황에서 완전 가방으로 전환할 수 있고, 완전 가방은 01 가방으로 전환할 수 있습니다
HDU3591 혼합 백팩 - 클래식
6분조 가방
7 의뢰 가방 있음
8 범용 물품
9 부분 알고리즘 최적화 및 가방 질문 변화
1) 바이너리 최적화
//  ,number[i]    ,            ,         、             。
for(int i=1;i<=n;i++){
    for(int k=1;k<=number[i];k*=2){
        for(int j=bag;j>=volume[i]*k;j--){
            dp[j]=max(dp[j],dp[j-volume[i]*k]+k);
        }
        number[i]-=k;//!!!
    }
    for(int j=bag;j>=volume[i]*number[i];j--){
        dp[j]=max(dp[j],dp[j-volume[i]*number[i]+number[i]);
    }
}
HDU3591 블렌드 백팩 - 클래식
나머지는 쓰고,
해당 제목은 본 블로그 DP 클래스에서 가방에 관한 제목을 참고하십시오.
(본고의 내용 구조는 dd대우의, 링크 중 하나를 참고했다.http://www.cnblogs.com/jbelial/articles/2116074.html(안에 작은 오류가 있음을 주의한다)

좋은 웹페이지 즐겨찾기