2011-12-30 8 views
7

मेरे कोड में, मानते हुए सी क्षमता है, एन आइटम की मात्रा है, डब्ल्यू [जे] आइटम जे का वजन है, और वी [जे] आइटम जे का मूल्य है , क्या यह 0-1 knapsack एल्गोरिदम के समान काम करता है? मैं कुछ डेटा सेट पर अपना कोड आजमा रहा हूं, और ऐसा लगता है कि यह मामला है। क्योंकि 0-1 नैपसैक एल्गोरिथ्म हम सिखाया गया है 2-आयामी है कारण मैं इस सोच रहा हूँ, जबकि यह 1-आयामी है:क्या ये 2 knapsack एल्गोरिदम समान हैं? (क्या वे हमेशा एक ही चीज़ आउटपुट करते हैं)

for (int j = 0; j < N; j++) { 
    if (C-w[j] < 0) continue; 
    for (int i = C-w[j]; i >= 0; --i) { //loop backwards to prevent double counting 
     dp[i + w[j]] = max(dp[i + w[j]], dp[i] + v[j]); //looping fwd is for the unbounded problem 
    } 
} 
printf("max value without double counting (loop backwards) %d\n", dp[C]); 

यहाँ 0-1 नैपसैक एल्गोरिथ्म के अपने कार्यान्वयन है : (एक ही चर के साथ)

for (int i = 0; i < N; i++) { 
    for (int j = 0; j <= C; j++) { 
     if (j - w[i] < 0) dp2[i][j] = i==0?0:dp2[i-1][j]; 
     else dp2[i][j] = max(i==0?0:dp2[i-1][j], dp2[i-1][j-w[i]] + v[i]); 
    } 
} 
printf("0-1 knapsack: %d\n", dp2[N-1][C]); 

उत्तर

3

हाँ, अपने एल्गोरिथ्म आप एक ही परिणाम हो जाता है। क्लासिक 0-1 बस्ता के लिए यह वृद्धि काफी लोकप्रिय है: Wikipedia यह बताते हैं इस प्रकार है:

साथ ही, यदि हम केवल एक 1-आयामी सरणी मीटर का उपयोग [डब्ल्यू] वर्तमान इष्टतम मान संग्रहीत है और इस पर पारित करने के सरणी I + 1 बार, एम [डब्ल्यू] से एम [1] हर बार फिर से लिखना, हम केवल ओ (डब्ल्यू) अंतरिक्ष के लिए एक ही परिणाम प्राप्त करते हैं।

ध्यान दें कि वे विशेष रूप से आपके पिछड़े पाश का उल्लेख करते हैं।

+0

ठीक है, इसे सत्यापित करने के लिए धन्यवाद। मुझे नहीं पता था कि वर्णित एल्गोरिदम विकिपीडिया वही था जिसका मैं उपयोग कर रहा था। –