Xác định số tổ hợp theo chiều dài

Liên hệ QC

NguyenNgocSon

KEEP WALKING
Tham gia
4/4/08
Bài viết
280
Được thích
832
Nghề nghiệp
Ths. Cầu hầm
Em có bài toán sau
Số liệu đầu vào là thanh thép có chiều dài L=6000mm
Có các đoạn có chiều dài là L1=200,L2=300,L3=4000,L4=5800
Xác định các tổ hợp có thể có từ các thanh Li sao cho tổng Li <=L
Ví dụ:
TH1=1xL1+1xL4
TH2=30XL1
....
Cám ơn nhiều !
 
Em có bài toán sau
Số liệu đầu vào là thanh thép có chiều dài L=6000mm
Có các đoạn có chiều dài là L1=200,L2=300,L3=4000,L4=5800
Xác định các tổ hợp có thể có từ các thanh Li sao cho tổng Li <=L
Ví dụ:
TH1=1xL1+1xL4
TH2=30XL1
....
Cám ơn nhiều !
Trường hợp này phải dùng thuật toán đệ quy
Tôi viết cho bạn một UDF dùng dưới dạng công thức mảng.
Hàm để gọi trên bảng tính:
PHP:
Function ChiaThep(ByVal DaiThanh As Double, Doan_ As Range)
Dim KetQua() As Long, Doan() As Double, i As Long, j As Long
ReDim Doan(1 To Doan_.Rows.Count)
For i = 1 To Doan_.Rows.Count
    Doan(i) = Doan_(i, 1).Value
Next
ReDim KetQua(1 To UBound(Doan, 1), 1 To 1)
i = 1
For j = 1 To UBound(Doan, 1)
    DeQuy DaiThanh, DaiThanh + 0, KetQua, i, Doan, j
Next
ReDim Preserve KetQua(1 To UBound(Doan, 1), 1 To UBound(KetQua, 2) - 1)
ChiaThep = KetQua
End Function
Thủ tục chính (đệ quy):
PHP:
Sub DeQuy(ByRef DaiThanh As Double, ByRef ConLai As Double, ByRef KetQua() As Long, ByRef iKetQua As Long, ByRef Doan() As Double, ByVal iDoan As Long)
Dim i As Long
If iDoan = UBound(Doan, 1) Then
    KetQua(iDoan, iKetQua) = ConLai \ Doan(iDoan)
    iKetQua = iKetQua + 1
    ReDim Preserve KetQua(1 To UBound(KetQua, 1), 1 To iKetQua)
    ConLai = DaiThanh
Else
    If ConLai < Doan(iDoan) Then
        DeQuy DaiThanh, ConLai, KetQua, iKetQua, Doan, iDoan + 1
    Else
        For i = ConLai \ Doan(iDoan) To 1 Step -1
            KetQua(iDoan, iKetQua) = i
            ConLai = ConLai - i * Doan(iDoan)
            If ConLai < Doan(UBound(Doan, 1)) Then
                iKetQua = iKetQua + 1
                ReDim Preserve KetQua(1 To UBound(KetQua, 1), 1 To iKetQua)
                ConLai = DaiThanh
            Else
                DeQuy DaiThanh, ConLai, KetQua, iKetQua, Doan, iDoan + 1
            End If
        Next
    End If
End If
End Sub
Lưu ý: Độ dài các đoạn phải được sắp xếp giảm dần
Xem cách dùng cụ thể trong file.
 

File đính kèm

  • Chia thep.xlsm
    16.6 KB · Đọc: 24
Quá hay !
Bài toàn giờ đặt ra và sẽ giới hạn như sau
Bác xem giúp có cách nào xử lý không
Cám ơn !
 

File đính kèm

  • Cutting-Pipe.xlsx
    16.6 KB · Đọc: 8
Web KT
Back
Top Bottom