下面我们将看一下Excel VBA中的一个程序,该程序可以解决背包问题的一个小实例。
定义:给定一组项目,每个项目都有一个权重和一个值,请确定要包含在集合中的项目,以使总值尽可能大且总权重小于给定的限制。它的名称源于某人遇到的问题,该人受到固定大小背包的约束,必须用最有用的物品填充它。
示例:5个具有给定重量,值和限制的项目。
在Excel中,此问题如下所示:
1.首先,我们声明Double类型的五个变量,名称分别为limit,weight,value,totalWeight和maximumValue。
2.接下来,我们声明名称为i,j,k,l,m的五个Integer类型的变量。
3.我们初始化两个变量。我们使用单元格D6的值初始化变量限制。我们使用值0初始化变量maximumValue。
maximumValue = 0
4.接下来,我们检查每个可能的解决方案。我们可以包含一个项目(1),也可以不包含(0)。我们从5 For Next循环开始。每个项目一个。
对于 j = 0 到 1
对于 k = 0 到 1
对于 l = 0 到 1
对于 m = 0 到 1
5.我们计算权重和可能的解决方案的价值。
值= 4 * i + 2 * j + 2 * k + 1 * l + 10 * m
6.仅当value大于maximumValue且权重小于limit时,我们才找到新的更好的解决方案。
7.如果为true,则将新的解决方案写入第4行,权重设置为totalWeight,值设置为maximumValue。
Range(“ C4”)。value = j
Range(“ D4”)。value = k
Range(“ E4”)。value = l
Range(“ F4”)。value = m
totalWeight =重量
最大值=值
8.不要忘记关闭If语句。
9.不要忘记关闭5 For Next循环。
下一个 l
下一个 k
下一个 j
下一个 i
Excel VBA会以此方式检查每个可能的解决方案,结果最佳解决方案将出现在第4行中。请记住,1表示我们包含一个项目,0表示我们将其省略。
10.最后,分别将最佳解的totalWeight和maximumValue分别写入单元格B6和B8。
Range(“ B8”)。value = maximumValue
11.测试程序。
结果:
结论:最好包括最后四个项,最大值为15。此解决方案的总权重为2 +1 + 1 + 4 = 8,不超过限制15。
注意:通过设置权重和值变量,可以解决此大小的背包问题(请参见可下载的Excel文件)。