Tôi đã gặp vấn đề này trên một trong các diễn đàn lập trình tiếng Nga, nhưng chưa đưa ra giải pháp thanh lịch.Trợ giúp thuật toán: cách phân chia mảng thành N đoạn với phân đoạn lớn nhất có thể (phân đoạn cân bằng)
Vấn đề:
Bạn có một mảng với N số nguyên dương, bạn cần phải chia nó thành M phân đoạn tiếp giáp, do đó tổng của phân khúc lớn nhất là giá trị nhỏ nhất có thể. Theo tổng số của phân đoạn, tôi có nghĩa là tổng của tất cả các số nguyên của nó. Nói cách khác, tôi muốn phân đoạn mảng cân bằng tốt, nơi bạn không muốn một phân đoạn đơn lẻ quá lớn.
Ví dụ:
Array: [4, 7, 12, 5, 3, 16]
M = 3, có nghĩa là tôi cần phải chia mảng của tôi vào 3 subarrays .
Giải pháp sẽ là: [4,7] [12, 5] [3, 16] sao cho phân khúc lớn nhất là [3, 16] = 19 và không có biến thể phân khúc nào khác có thể tạo phân đoạn lớn nhất với tổng số nhỏ hơn .
Một ví dụ khác:
- Array [3, 13, 5, 7, 18, 8, 20, 1]
- M = 4
Giải pháp: [3, 13, 5] [7, 18] [8] [20, 1], phân đoạn "béo nhất" là [7, 18] = 25 (đúng với tôi nếu tôi sai, tôi đã tạo ra ví dụ này)
Tôi có cảm giác rằng đây là một số vấn đề CS/toán kinh điển, có lẽ với một số tên người nổi tiếng liên kết với nó, giống như vấn đề của Dijkstra. - Có giải pháp nào cho nó không? - Nếu không, bạn có thể đưa ra một số giải pháp khác ngoài việc ép buộc không, đó là, theo như tôi hiểu phức tạp về thời gian, theo cấp số mũ. (N^M, cụ thể hơn).
Cảm ơn trước, stackoverflowers.
Câu hỏi này sẽ phù hợp hơn với [Lập trình Stack Exchange] (http://programmers.stackexchange.com/). –
@Jordan tại sao? [Trợ giúp StackOverflow] (http://stackoverflow.com/help/on-topic) cho biết bạn có thể hỏi về thuật toán phần mềm _a. [Lập trình trợ giúp] (http://programmers.stackexchange.com/help/on-topic) nói rằng bạn có thể hỏi về _algorithm và các khái niệm cấu trúc dữ liệu_. Tôi có thể thấy câu hỏi này phù hợp với một trong hai trang web. – kojiro
Nếu đây là câu hỏi về bài tập về nhà, bạn nên hiển thị một số mã và nghiên cứu cơ bản của riêng mình (như định nghĩa trang). Nó có vẻ giống như vấn đề knappsack, btw. – eckes