你有許多石頭已知重量w1,...,wn。編寫一個程序,將石塊重新排列成兩堆,這樣兩堆之間的重量差異很小。 我有DP算法:平衡石頭
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;
}
但它是一個有點天真。它需要太多內存,我需要一些提示來簡化它。有沒有更有效的方法?
好'O(n^2)'內存不是太多內存。大多數DP算法具有「O(n^2)」時間以及空間複雜度。如果你將時間從'O(2^n)'減少到'O(n^2)',你將不得不使用額外的空間! –
我認爲你的問題是分區問題,你可能想看看 https://en.wikipedia.org/wiki/Partition_problem –
@PetarPetrovic你已經鏈接的信息是相當完整的主題,你應該使它成爲一個回答。 – Steeve