假设某工地需要的钢材都是 10m/根 的原材料
现在因建筑需要要下列长度钢材5.5m   4.7m   4.2m   3.7m  1.1m   7.0m   3.0m
切剩的料为废料请设计一个算法,如何组织切割这些钢材
要求:尽量使废料集中到最后一根,且需要根数最少
如上述应该是  
 4.2+4.7+1.1   / 废料 0
 7.0+3.0       /废料 0
 5.5+3.7       /废料 0.8

解决方案 »

  1.   

    需要事先将需要的长度降序排列,这一步相信你已经会了,不赘述。
    算法如下。注意仅可能使用整数,不仅速度快,而且没有进制引起的误差。Dim i, j As Integer
    Dim sum As Integer
    Dim tmp As Stringnd(0) = 70
    nd(1) = 55
    nd(2) = 47
    nd(3) = 42
    nd(4) = 37
    nd(5) = 30
    nd(6) = 11For i = 0 To 6
        If nd(i) > 0 Then
            sum = nd(i)
            tmp = nd(i)
            
            
            For j = i + 1 To 6
                If sum + nd(j) <= 100 And nd(j) > 0 Then
                    sum = sum + nd(j)
                    tmp = tmp & "+" & nd(j)
                    nd(j) = 0
                    If sum = 100 Then Exit For
                End If
            Next j
            tmp = tmp & "=" & sum
            Debug.Print tmp
        End If
    Next i运行结果
    70+30=100
    55+42=97
    47+37+11=95
      

  2.   


    2、考虑通用性,如果有1000 个数据呢,怎么办?
    ------------------------------------------
    用数据库。SQL查询语句。系统会自动帮你算的,又快又省事。这方面,SQL Server版的j9988很强,你要能找到他就好了(他现在不常在线。)
      

  3.   

    用数据库。SQL查询语句。系统会自动帮你算的,又快又省事。这方面,SQL Server版的j9988很强,你要能找到他就好了(他现在不常在线。)
    -------------------------------------------
    不会吧?这么夸张?
    用数组也就行了吧
      

  4.   

    Dim s As Long, i As Long, j As Long, out As String
    Dim a(0 To 6) As Single, b(0 To 6, 0 To 6) As Boolean, c(0 To 6) As Single
    a(0) = 5.5
    a(1) = 4.7
    a(2) = 4.2
    a(3) = 3.7
    a(4) = 1.1
    a(5) = 7
    a(6) = 3
    For i = 0 To 6
      c(i) = a(i)
    Next i
    s = 10
    For i = 0 To 6
      b(i, i) = True
      For j = i + 1 To 6
        If a(i) + a(j) > a(i) And a(i) + a(j) <= s Then
          a(i) = a(i) + a(j)
          b(i, j) = True
        End If
      Next j
    Next i
    For i = 0 To 6
      out = ""
      For j = 0 To 6
        If b(i, j) Then
          out = out & CStr(c(j)) & "+"
        End If
      Next j
      out = Left(out, Len(out) - 1) & "  废料/" & CStr(Round(s - a(i), 1))
      Print out
    Next i
    试试看
      

  5.   

    我想编程的时候还必须考虑需求量问题,例如,上面楼主给出的:现在因建筑需要要下列长度钢材5.5m   4.7m   4.2m   3.7m  1.1m   7.0m   3.0m
    切剩的料为废料只是需求的规格,但并没有明确的说出要多少条。需求量不同可能会导致结果不同。
      

  6.   

    从一组数据里取得合刚好等于某数的组合的算法:
    sub Sum(byref data() ,iBegin as interger,iSum as interger) 
    '参数描述 data是存储数据的容器 ibegin是搜索的开始位置,isum是要得到的合
    for j=ibegin to ubound(data)
    for i = j+1 to ubound(data)
       if data(j) +data(i)=isum then
          debug.print data(j)& data(i)
          data(j)=0
          data(i)=0
          给序号从j开始后面的数排序
          exit sub
       else if data(j)+data(i)<isum then
          GetSum(data,i,isum-data(j))
       end if
    next i
    next j
    end sub一个设想,没编码实现过,可能还有些问题,但是大致思想在这里了.
      

  7.   

    从一组数据里取得合刚好等于某数的组合的算法:
    function Sum(byref data() ,iBegin as interger,iSum as interger) as string 
    '参数描述 data是存储数据的容器 ibegin是搜索的开始位置,isum是要得到的合
    sum = ""
    for j=ibegin to ubound(data)
    for i = j+1 to ubound(data)
       if data(j) +data(i)=isum then
          
          sum = sum & data(j) & data(i)
          data(j)=0
          data(i)=0
          给序号从j开始后面的数排序
          exit function
       else if data(j)+data(i)<isum then
          sum = sum & Sum(data,i,isum-data(j))
       end if
    next i
    next j
    end function大致就这样了吧,关键是想法,这样的代码肯定不可以.
      

  8.   

    背包问题的一个变化,在google搜一下“背包问题”就可以解决了