Cho một mảng số nguyên chia mảng thành 2 tập con JavaScript

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, S1S2, sao cho hiệu giữa tổng các phần tử của S1S2 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

S0
S1

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

  1. 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
  2. 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 S1S2. 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 S1S2

 
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

Chủ Đề