0-1 배낭 문제
11231 단어 cpp
문제 설명
특정 값을 갖는 n개의 가중치가 주어지면 이 가중치를 주어진 용량(maxWeight)의 배낭에 넣습니다. 무게 추가 후 배낭의 총 무게는 용량(maxWeight)보다 작거나 같아야 합니다. 여기서 목표는 배낭에서 가능한 최대 총 가치를 찾는 것입니다. 모든 가중치는 한 번만 선택할 수 있습니다. 예를 들어 :
Input:
n=4
maxWeight=5
weights={4,3,5,1}
value={1,2,2,3}
Output:
5
위의 예에서 weights:{3,1}와 value:{2,3}는 각각 가중치 조합 중 최대값인 5의 합계를 가집니다.
관찰
여기서 주요 관찰은 무게 합이 배낭의 용량보다 작거나 같고 최대 값 합을 갖는 가중치의 하위 집합을 찾아야 한다는 것입니다.
재귀적 접근
재귀적으로 인덱스 0에서 n-1로 이동하고 두 가지 작업을 수행합니다.
Input:
n=4
maxWeight=5
weights={4,3,5,1}
value={1,2,2,3}
Output:
5
재귀적으로 인덱스 0에서 n-1로 이동하고 두 가지 작업을 수행합니다.
수행 후 다음 요소를 재귀적으로 호출할 것입니다. 조건에 따라 위에 제공된 작업 중 하나 또는 둘 모두일 수 있습니다. 최대 총 값을 찾아야 하므로 두 작업의 최대값을 반환합니다. 배열 크기를 초과하면 중지하고 돌아와야 합니다. 따라서 결국 특정 값을 가진 가중치를 선택하거나 무시하도록 선택한 모든 하위 집합의 최대값을 갖게 됩니다.
int rec_helper(int curWeightSum,int i,int n,int wt[],int val[],int maxWeight,int **dp){
if(i==n){
return 0;
}
if(dp[i][curWeightSum]!=-1){
return dp[i][curWeightSum];
}
dp[i][curWeightSum] = rec_helper(curWeightSum,i+1,n,wt,val,maxWeight,dp);
if(curWeightSum+wt[i]<=maxWeight) {
dp[i][curWeightSum] = max(dp[i][curWeightSum],
val[i] + rec_helper(curWeightSum + wt[i], i + 1, n, wt, val, maxWeight, dp));
}
return dp[i][curWeightSum];
}
int knapsack(int n,int wt[],int val[],int maxWeight){
int** dp=new int*[n];
for(int i=0;i<n;i++){
dp[i]=new int[maxWeight+1];
for(int j=0;j<maxWeight+1;j++){
dp[i][j]=-1;
}
}
return rec_helper(0,0,n,wt,val,maxWeight,dp);
}
메모화 - 여기에서는 반복되는 재귀 호출에 대해 dp에 저장된 값을 사용할 수 있도록 재귀 호출을 저장하기 위해 2차원 배열인 'dp'를 사용했습니다. 이것은 시간 복잡도를 줄이는 데 유용합니다.
시간 복잡도: O(n*maxWeight). 우리는 대부분의 반복되는 전화를 피했습니다.
공간 복잡도: O(n*maxWeight). 2차원 배열 dp를 추가 공간으로 사용했습니다.
동적 접근
이 경우 1차원 배열을 사용하여 표를 작성합니다. 치수가 maxWeight+1(배낭의 용량)과 동일한 치수입니다. 여기서 우리는 재귀 접근 방식에 명시된 동일한 두 가지 작업을 수행합니다.
int dp[maxWeight+1];
for(int i=0;i<maxWeight+1;i++){
dp[i]=0;
}
for(int i=0;i<n;i++){
for(int j=maxWeight;j>=wt[i];j--){
dp[j]=max(dp[j],val[i]+dp[j-wt[i]]);
}
}
return dp[maxWeight];
여기서 dp 배열의 셀 값은 operation1과 operation2의 최대값이 됩니다. 1차원 배열을 사용했습니다. 여기서 j번째 셀은 특정 i번째 가중치에 대한 작업을 수행하는 동안 가중치 j가 있는 배낭을 나타냅니다. 따라서 배열은 i번째 가중치에 대해 실행되는 동안 (i-1)번째 가중치까지 결과를 유지합니다. dp[maxWeight]를 반환하면 답이 나옵니다. 초기에 배열의 모든 값은 빈 배낭의 최대값이 0이므로 0입니다.
시간 복잡도: O(n*maxWeight).
공간 복잡도: O(maxWeight). 2차원 배열 dp를 추가 공간으로 사용했습니다.
Reference
이 문제에 관하여(0-1 배낭 문제), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/edualgo/0-1-knapsack-problem-222d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)