Giả sử chúng ta có một danh sách độ dài thanh được gọi là rodLen. Chúng tôi cũng có hai số nguyên khác được gọi là lợi nhuận và chi phí, đại diện cho lợi nhuận trên mỗi chiều dài và chi phí mỗi lần cắt. Chúng tôi có thể kiếm được lợi nhuận trên một đơn vị chiều dài của thanh nhưng chúng tôi chỉ có thể bán các thanh có cùng chiều dài. Chúng ta cũng có thể cắt một thanh thành hai đoạn sao cho độ dài của chúng là số nguyên, nhưng chúng ta phải trả chi phí cho mỗi lần cắt. Chúng ta có thể cắt một thanh bao nhiêu lần tùy thích. Chúng tôi phải tìm ra lợi nhuận tối đa mà chúng tôi có thể tạo ra.
Vì vậy, nếu đầu vào giống như rodLen =[7, 10] lợi nhuận =6 chi phí =4, thì đầu ra sẽ là 82, vì chúng ta có thể cắt thanh có chiều dài 7 thành hai thanh, có chiều dài 5 và 2. Khi đó chúng ta có thể cắt que có chiều dài 10 thành hai que đều có chiều dài là 5. Sau đó bán cả 3 que có chiều dài là 5 với tổng lãi là (5 + 5 + 5) * 6 - (2 * 4) =82.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- n:=kích thước của rodLen
- nếu n giống 0, thì
- trả về 0
- l_max:=tối đa của rodLen
- p_max:=0
- để cắt trong phạm vi từ 1 đến l_max, hãy thực hiện
- p_cut:=0
- đối với mỗi rod_len trong rodLen, thực hiện
- nếu rod_len
- chuyển sang lần lặp tiếp theo
- nếu rod_len
- c_count:=rod_len / cut
- total_len:=c_count * lần cắt
- nếu rod_len giống với total_len, thì
- c_count:=c_count - 1
- curr_profit:=total_len * lợi nhuận - chi phí * c_count
- nếu curr_profit <0, thì
- chuyển sang lần lặp tiếp theo
- p_cut:=p_cut + curr_profit
- p_max:=tối đa là p_max và p_cut
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
def solve(rodLen, profit, cost): n = len(rodLen) if n == 0: 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 rodLen = [7, 10] profit = 6 cost = 4 print(solve(rodLen, profit, cost))
Đầu vào
[7, 10], 6, 4
Đầu ra
82