按键精灵 开发者认证 5级 问答 ,求高手(有一根长度600cm的钢筋,需要截成长度分别为69cm、39cm、...)
有一根长度600cm的钢筋,需要截成长度分别为69cm、39cm、29cm三种规格的短料,在三种规格的短料至少各截1截的前提下,如何截取才能使剩余材料最少?请写出代码。...
有一根长度600cm的钢筋,需要截成长度分别为69cm、39cm、29cm三种规格的短料,在三种规格的短料至少各截1截的前提下,如何截取才能使剩余材料最少?请写出代码。
展开
展开全部
//用穷举法,把所有的结果都算出了,然后取最小的哪组结果即可。
//先求出所有剩余的结果,用数组表示
Dim n,r //n是剩余量的值,临时变量,r是计算结果
i = 0 : j = 0 : k = 0 : m = 0
//上面i,j,k分别是69cm,39cm,29cm的段数,很容易知道i<8,j<15,k<20,m是剩余量数组下标
For i = 0 To 8
For j = 0 To 15
For k = 1 To 20
n = 600 - 69 * i - 39 * j - 29 * k
If n >= 0 Then
Redim Preserve a(m), b(m)
a(m) = n
b(m) = i & "," & j & "," & k
m = m + 1
End If
Next
Next
Next
//下面找出最小剩余量
n = 600 //剩余量不可能比600大
For i = 0 To m - 1
If n > a(i) Then
n = a(i)
r = b(i)
End If
Next
//经过上面代码,可知道r的值是0,2,18,可以用 MessageBox r 查看
//也就是当i=0,j=2,k=18,剩余量最小,此时,n=0,上面的n是剩余量。
//当然,代码只能选出一组结果,如果想选出所有结果,加上下面代码:
rn = 0
For i = 0 To m - 1
If n = a(i) Then
Redim Preserve c(rn)
n = a(i)
c(rn) = b(i)
rn = rn + 1
End If
Next
//下面查看结果
For i = 0 To rn - 1
MessageBox c(i)
Next
//这个穷举法效率低,如果想高效,要有更好的算法,此题i,j,k是有制约的,所以肯定有更好的算法,不过本人水平有限,更好算法暂时想不出。
//先求出所有剩余的结果,用数组表示
Dim n,r //n是剩余量的值,临时变量,r是计算结果
i = 0 : j = 0 : k = 0 : m = 0
//上面i,j,k分别是69cm,39cm,29cm的段数,很容易知道i<8,j<15,k<20,m是剩余量数组下标
For i = 0 To 8
For j = 0 To 15
For k = 1 To 20
n = 600 - 69 * i - 39 * j - 29 * k
If n >= 0 Then
Redim Preserve a(m), b(m)
a(m) = n
b(m) = i & "," & j & "," & k
m = m + 1
End If
Next
Next
Next
//下面找出最小剩余量
n = 600 //剩余量不可能比600大
For i = 0 To m - 1
If n > a(i) Then
n = a(i)
r = b(i)
End If
Next
//经过上面代码,可知道r的值是0,2,18,可以用 MessageBox r 查看
//也就是当i=0,j=2,k=18,剩余量最小,此时,n=0,上面的n是剩余量。
//当然,代码只能选出一组结果,如果想选出所有结果,加上下面代码:
rn = 0
For i = 0 To m - 1
If n = a(i) Then
Redim Preserve c(rn)
n = a(i)
c(rn) = b(i)
rn = rn + 1
End If
Next
//下面查看结果
For i = 0 To rn - 1
MessageBox c(i)
Next
//这个穷举法效率低,如果想高效,要有更好的算法,此题i,j,k是有制约的,所以肯定有更好的算法,不过本人水平有限,更好算法暂时想不出。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询