DP 백팩 매듭(2)(구조가 완전하고 내용이 간결하며 상태 방정식 편)
아래에 완전한 가방 모형을 사용한 경우 한 단계 최적화를 할 수 있고volume[i]
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(안에 작은 오류가 있음을 주의한다)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【경쟁 프로 전형적인 90문】008의 해설(python)의 해설 기사입니다. 해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다. ※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다. 문자열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.