假设某工地需要的钢材都是 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
现在因建筑需要要下列长度钢材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
算法如下。注意仅可能使用整数,不仅速度快,而且没有进制引起的误差。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、考虑通用性,如果有1000 个数据呢,怎么办?
------------------------------------------
用数据库。SQL查询语句。系统会自动帮你算的,又快又省事。这方面,SQL Server版的j9988很强,你要能找到他就好了(他现在不常在线。)
-------------------------------------------
不会吧?这么夸张?
用数组也就行了吧
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
试试看
切剩的料为废料只是需求的规格,但并没有明确的说出要多少条。需求量不同可能会导致结果不同。
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一个设想,没编码实现过,可能还有些问题,但是大致思想在这里了.
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大致就这样了吧,关键是想法,这样的代码肯定不可以.