Bài toán tìm tổng con lớn nhất.
Giả sử một công ty du lịch đã thiết kế một chương trình du lịch cố định đi qua lần lượt n địa điểm. Mỗi khách hàng lại có các đánh giá khác nhau cho mỗi địa điểm này. Giả sử khách hàng tên An đã đánh giá các địa điểm trong chương trình du lịch theo dãy các giá trị: A[0], A[1], ..., A[n - 1]
Công ty muốn sắp sắp cho khách hàng An đi một phần của chương trình du lịch bằng cách đi theo một dãy con liên tục các địa điểm, ví dụ:
i, i + 1, i + 2, ..., j
Mục đích của việc chọn chương trình cho khách hàng An là làm sao cho tổng giá trị:
A[i] + A[i + 1] + ... + A[j] (1) là lớn nhất có thể.
Cho trước dãy các đánh giá n địa điểm của chương trình du lịch, hãy thiết kế một chương trình du lịch con cho khách hàng sao cho tổng (1) là lớn nhất.
Ví dụ nêu dãy các đánh giá là: 1, 7, -5, -9, 3, -1,10, -6, 5
thì chương trình du lịch con đi qua các địa điểm với đánh giá 3, -1, 10 có tổng lớn nhất tức là làm khách hàng hài lòng nhất.
Bằng cách nhấp vào Đăng nhập, bạn đồng ý Chính sách bảo mật và Điều khoản sử dụng của chúng tôi. Nếu đây không phải máy tính của bạn, để đảm bảo an toàn, hãy sử dụng Cửa sổ riêng tư (Tab ẩn danh) để đăng nhập (New Private Window / New Incognito Window).
Hướng dẫn:
Gọi S(i, j) = A[i] + A[i + 1] + ... + A[j]
Khi đó bài toán đặt ra là cần tìm i, j sao cho giá trị S(i, j) lớn nhất. Từ đó suy ra lời giải đơn giản sau:
A = [1,7,-5,-9,3,-1,10,-6, 5]
n = len(A)
imax = 0
jmax = 0
Smax = A[0]
for i in range(n):
S = 0
for j in range(i,n):
S = S + A[j]
if S > Smax:
imax = i
jmax = j
Smax = S
print("Chương trình du lịch tối ưu là:")
print(imax, jmax)
for i in range(imax, jmax+1):
print (A[i], end = " ")
Hôm nay bạn thế nào? Hãy nhấp vào một lựa chọn, nếu may mắn bạn sẽ được tặng 50.000 xu từ Lazi
Vui | Buồn | Bình thường |