Cho một tập hợp các số nguyên dương S
, phân chia tập hợp S
thành hai tập hợp con, S1
và S2
, sao cho hiệu giữa tổng các phần tử của S1
và S2
là nhỏ nhất. Giải pháp sẽ trả về chênh lệch tuyệt đối tối thiểu giữa tổng các phần tử của hai phân vùng
Ví dụ, hãy xem xét S = {10, 20, 15, 5, 25}
Chúng ta có thể phân hoạch S
thành hai phân hoạch trong đó chênh lệch tuyệt đối nhỏ nhất giữa tổng các phần tử là 5
________số 8_______S2 = {15, 25}
Lưu ý rằng giải pháp này không phải là duy nhất. Sau đây là một giải pháp khác
S
0S
1
Thực hành vấn đề này
Vấn đề này là một phiên bản tối ưu hóa của vấn đề phân vùng. Ý tưởng là xem xét từng mục trong tập hợp đã cho S
từng cái một và đối với mỗi mục, có hai khả năng
- Bao gồm mục hiện tại trong tập hợp con
S1
và lặp lại cho các mục còn lại - Bao gồm mục hiện tại từ tập hợp con
S2
và lặp lại cho các mục còn lại
Cuối cùng, trả về chênh lệch tối thiểu mà chúng tôi nhận được bằng cách bao gồm mục hiện tại trong S1
và S2
. Khi không còn phần tử nào trong tập hợp, hãy trả về chênh lệch tuyệt đối giữa các phần tử của S1
và S2
Sau đây là triển khai ý tưởng C++, Java và Python
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include
#include
#include
sử dụng không gian tên std;
// Phân vùng đặt `S` thành hai tập con, `S1` và `S2`, sao cho
// chênh lệch giữa tổng các phần tử trong `S1` và tổng
// các phần tử trong `S2` được thu nhỏ
int findMinAbsDiff[vectơ const &S, int n, int S1, int S2]
{
// Trường hợp cơ bản. nếu danh sách trống, hãy trả về giá trị tuyệt đối
// chênh lệch giữa cả hai nhóm
nếu [n