आपके पास ज्ञात वजन w1, ..., wn के साथ कई पत्थरों हैं। एक कार्यक्रम लिखें जो पत्थरों को दो ढेर में पुनर्व्यवस्थित करेगा जैसे कि दो ढेर के बीच वजन अंतर न्यूनतम था। मैं डी पी एल्गोरिथ्म है:पत्थरों को संतुलित करना
int max(int a, int b){
return a >= b ? a : b;
}
int diff(int* weights, int number_elements, int capacity){
int **ptrarray = new int* [capacity + 1];
for (int count = 0; count <= capacity; count++) {
ptrarray[count] = new int [number_elements + 1];
}
for (int i = 0; i <= number_elements; ++i){
ptrarray[0][i] = 0;
}
for (int i = 0; i <= capacity; ++i){
ptrarray[i][0] = 0;
}
for (int i = 1; i <= number_elements; ++i){
for (int j = 1; j <= capacity; ++j){
if(weights[i - 1] <= j){
ptrarray[j][i] = max(ptrarray[j][i - 1], ptrarray[j - weights[i - 1]][i-1] + weights[i - 1]);
} else{
ptrarray[j][i] = ptrarray[j][i - 1];
}
}
}
return ptrarray[capacity][number_elements];
}
int main(){
int capacity;
int number_elements;
cin >> number_elements;
int* weights = new int[number_elements];
int sum = 0;
int first_half;
for (int i = 0; i < number_elements; ++i){
cin >> weights[i];
sum+=weights[i];
}
first_half = sum/2;
int after;
after = diff(weights, number_elements, first_half);
cout << sum - 2*after;
return 0;
}
लेकिन यह एक छोटा सा अनुभवहीन है। यह बहुत अधिक स्मृति की मांग करता है, और मुझे इसे सरल बनाने के लिए कुछ संकेतों की आवश्यकता है। क्या एक और अधिक प्रभावी दृष्टिकोण है?
अच्छी तरह से ओ ओ (एन^2) 'स्मृति बहुत अधिक स्मृति नहीं है। अधिकांश डीपी एल्गोरिदम में 'ओ (एन^2) 'समय के साथ-साथ अंतरिक्ष जटिलता भी होती है। यदि आप 'ओ (2^एन)' से 'ओ (एन^2)' से समय कम कर रहे हैं, तो आपको अतिरिक्त जगह का उपयोग करना होगा! –
मुझे लगता है कि आपकी समस्या विभाजन समस्या है, आप https://en.wikipedia.org/wiki/Partition_problem –
@PetarPetrovic आपके द्वारा लिंक की गई जानकारी विषय पर बहुत पूर्ण है, आपको इसे बनाना चाहिए जवाब। – Steeve