你有许多石头已知重量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