Cho danh sách độ dài thanh rodLen, lợi nhuận trên đơn vị độ dài profit, chi phí mỗi lần cắt cost. Chỉ bán được các thanh cùng độ dài. Cắt thanh thành các đoạn nguyên, mỗi cắt tốn cost. Tìm lợi nhuận tối đa.
Ví dụ
Input: rodLen = [7, 10], profit = 6, cost = 4
Output: 82
Giải thích: Cắt 7 → 5+2 (1 cắt), cắt 10 → 5+5 (1 cắt). Bán 3 thanh độ dài 5: (5+5+5)*6 - 2*4 = 90 - 8 = 82.
Thuật toán (Thử mọi độ dài cắt có thể)
- Duyệt độ dài thanh mục tiêu
cutstừ 1 đếnmax(rodLen). - Với mỗi
cuts, tính lợi nhuận từ mỗi thanh gốc:- Số đoạn được:
c_count = rod_len // cuts - Tổng độ dài bán được:
total_len = c_count * cuts - Nếu thanh chia hết (
rod_len == total_len) → số cắt =c_count - 1(không cắt đoạn cuối). - Lợi nhuận thanh này:
total_len * profit - cost * c_count - Nếu lợi nhuận < 0 → bỏ qua thanh này.
- Số đoạn được:
- Tổng lợi nhuận cho
cutsnày, cập nhật max.
Mã nguồn Python
def solve(rodLen, profit, cost):
if not rodLen:
return 0
l_max = max(rodLen)
p_max = 0
for cuts in range(1, l_max + 1):
p_cut = 0
for rod_len in rodLen:
if rod_len < cuts:
continue
c_count = rod_len // cuts
total_len = c_count * cuts
if rod_len == total_len:
c_count -= 1
curr_profit = total_len * profit - cost * c_count
if curr_profit < 0:
continue
p_cut += curr_profit
p_max = max(p_max, p_cut)
return p_max
# Test
rodLen = [7, 10]
profit = 6
cost = 4
print(solve(rodLen, profit, cost)) # Output: 82
Độ phức tạp
- Thời gian:
O(n * L),L = max(rodLen). - Không gian:
O(1).