배낭 알고리즘을 풀기 위해 사용하고있는 배낭 클래스를 작성했습니다. 이 클래스는 작동하고 동적 프로그래밍 알고리즘을 사용하여 문제를 해결합니다.0/1 배낭 증인 생성
최대 값을 찾기 위해 선형 O (W) 공간을 사용하도록 코드에서 일부 최적화를 구현했지만 증인을 찾으려고 할 때 여전히 불리언 테이블을 유지하는 O (nW) 공간이 필요합니다.
최소 용량의 배낭과 O (nW)의 동일한 복잡성을 가진 배낭의 증인을 찾을 수 있는지 누군가가 말해 줄 수 있습니까? W는 배낭 용량입니다.
코드에 몇 가지 최적화가 더 있다고 생각되는 경우 알려주십시오.
class Knapsack{
private:
vector<int> value, weight, answer, DP;
vector<bool> isin;
int capacity;
public:
Knapsack(vector<int> value, vector<int> weight, int capacity, bool needWitness){
this->value = value;
this->weight = weight;
this->capacity = capacity;
this->answer.clear(); this->isin.clear(); this->DP.clear();
this->DP.resize(capacity + 1, false);
if (needWitness){
this->isin.resize(value.size() * (capacity + 1), false);
solveWithWitness();
}
else{
solveWithoutWitness();
}
}
void solveWithoutWitness(){
for (int i = 0; i < value.size(); i++){
for (int w = capacity; w >= weight[i]; w--){
if (DP[w] < value[i] + DP[w - weight[i]]){
DP[w] = value[i] + DP[w - weight[i]];
}
}
}
}
void solveWithWitness(){
for (int i = 0; i < value.size(); i++){
for (int w = capacity; w >= weight[i]; w--){
if (DP[w] < value[i] + DP[w - weight[i]]){
DP[w] = value[i] + DP[w - weight[i]];
isin[ i*capacity + w ] = true;
}
}
}
int position = value.size()-1;
int w = capacity;
while (position >= 0){
if (isin[ position*capacity + w ]){
answer.push_back(position);
w -= weight[position];
}
position--;
}
}
vector<int> getWitness(){
return this->answer;
}
int solution(){
return DP[capacity];
}
};
답변 해 주셔서 감사합니다. "이제 나머지 n/2 단계에 대해 DP를 실행하여 첫 번째 n/2 개 항목에서 각 셀에 도달하는 데 필요한 가중치를 추적합니다."라고 말했습니다. 이 단계에 대해 자세히 설명해 주시겠습니까? –
이것은 백엔드 전체 체인이 아닌 n/2-item 이후의 셀만 추적한다는 점을 제외하고는 증인이있는 DP와 비슷합니다. – tmyklebu