Tôi đã gặp một vấn đề trong đó mục tiêu là sử dụng lập trình động (thay vì các phương pháp khác). Có một khoảng cách được kéo dài và một bộ dây cáp có độ dài khác nhau. Số lượng cáp tối thiểu cần thiết để kéo dài khoảng cách chính xác là gì?
Đối với tôi điều này trông giống như một vấn đề về chiếc ba lô , nhưng vì có thể có bội số của một độ dài cụ thể, đó là một vấn đề về chiếc ba lô bị ràng buộc, thay vì vấn đề về chiếc ba lô 0/1. (Coi giá trị của mỗi vật phẩm là trọng lượng của nó.) Sử dụng cách tiếp cận ngây thơ (và không quan tâm đến việc mở rộng không gian tìm kiếm), phương pháp tôi đã sử dụng để chuyển đổi vấn đề về chiếc ba lô bị ràng buộc thành vấn đề về chiếc ba lô 0/1, chỉ đơn giản là chia các bội số thành đơn và áp dụng thuật toán lập trình động nổi tiếng. Thật không may, điều này dẫn đến kết quả không tối ưu.
Ví dụ: cáp đã cho:
1 x 10ft,
1 x 7ft,
1 x 6ft,
5 x 3ft,
6 x 2ft,
7 x 1ft
Nếu khoảng mục tiêu là 13ft, thuật toán DP chọn 7 + 6 để kéo dài khoảng cách. Một thuật toán tham lam sẽ chọn 10 + 3, nhưng đó là một ràng buộc cho số lượng cáp tối thiểu. Vấn đề phát sinh, khi cố gắng kéo dài 15ft. Thuật toán DP đã kết thúc chọn 6 + 3 + 3 + 3 để có 4 cáp, trong khi thuật toán tham lam chọn chính xác 10 + 3 + 2 chỉ cho 3 cáp.
Dù sao, thực hiện một số quét ánh sáng chuyển đổi giới hạn thành 0/1, có vẻ như cách tiếp cận nổi tiếng để chuyển đổi nhiều mục thành {p, 2p, 4p ...}. Câu hỏi của tôi là làm thế nào để chuyển đổi này hoạt động nếu p + 2p + 4p không thêm vào số lượng nhiều mục. Ví dụ: Tôi có 5 cáp 3ft. Tôi không thể thêm {3, 2x3, 4x3} vì 3 + 2x3 + 4x3> 5x3. Tôi có nên thêm {3, 4x3} không?
[Tôi hiện đang cố gắng tìm hiểu bài báo "Vấn đề Knapsack Oregon Trail", nhưng hiện tại có vẻ như cách tiếp cận được sử dụng không có lập trình động.]