Option Explicit
Dim a(4) As Byte
Dim h As Byte
Dim i As Integer
Private Sub Command1_Click()
For i = 1 To 5
a(i - 1) = Mid(Text1, i, 1)
Next
If (a(0) + a(1) + a(2)) Mod 10 = 0 Then
h = a(3) + a(4) '012
ElseIf (a(0) + a(1) + a(3)) Mod 10 = 0 Then
h = a(2) + a(4) '013
ElseIf (a(0) + a(1) + a(4)) Mod 10 = 0 Then
h = a(2) + a(3) '014
ElseIf (a(0) + a(2) + a(3)) Mod 10 = 0 Then
h = a(1) + a(4) '023
ElseIf (a(0) + a(2) + a(4)) Mod 10 = 0 Then
h = a(1) + a(3) '024
ElseIf (a(0) + a(3) + a(4)) Mod 10 = 0 Then
h = a(1) + a(2) '034
ElseIf (a(2) + a(3) + a(4)) Mod 10 = 0 Then
h = a(1) + a(0) '234
ElseIf (a(1) + a(3) + a(4)) Mod 10 = 0 Then
h = a(2) + a(0) '134
ElseIf (a(1) + a(2) + a(4)) Mod 10 = 0 Then
h = a(0) + a(3) '124
ElseIf (a(1) + a(2) + a(3)) Mod 10 = 0 Then
h = a(0) + a(4) '123
End If
Text2 = h
End Sub
Private Sub Form_Load()
Text1 = ""
Text2 = ""
End Sub
按上述算法编写函数和程序如下:
【程序】
# include
# define N 100
double limitW,totV,maxV;
int option[N],cop[N];
struct { double weight;
double value;
}a[N];
int n;
void find(int i,double tw,double tv)
{ int k;
/*考虑物品i包含在当前方案中的可能性*/
if (tw+a.weight<=limitW)
{ cop=1;
if (i
else
{ for (k=0;k
option[k]=cop[k];
maxv=tv;
}
cop=0;
}
/*考虑物品i不包含在当前方案中的可能性*/
if (tv-a.value>maxV)
if (i
else
{ for (k=0;k
option[k]=cop[k];
maxv=tv-a.value;
}
}
void main()
{ int k;
double w,v;
printf(“输入物品种数\n”);
scanf((“%d”,&n);
printf(“输入各物品的重量和价值\n”);
for (totv=0.0,k=0;k
{ scanf(“%1f%1f”,&w,&v);
a[k].weight=w;
a[k].value=v;
totV+=V;
}
printf(“输入限制重量\n”);
scanf(“%1f”,&limitV);
maxv=0.0;
for (k=0;k find(0,0.0,totV);
for (k=0;k
if (option[k]) printf(“%4d”,k+1);
printf(“\n总价值为%.2f\n”,maxv);
}
作为对比,下面以同样的解题思想,考虑非递归的程序解。为了提高找解速度,程序不是简单地逐一生成所有候选解,而是从每个物品对候选解的影响来形成值得进一步考虑的候选解,一个候选解是通过依次考察每个物品形成的。对物品i的考察有这样几种情况:当该物品被包含在候选解中依旧满足解的总重量的限制,该物品被包含在候选解中是应该继续考虑的;反之,该物品不应该包括在当前正在形成的候选解中。同样地,仅当物品不被包括在候选解中,还是有可能找到比目前临时最佳解更好的候选解时,才去考虑该物品不被包括在候选解中;反之,该物品不包括在当前候选解中的方案也不应继续考虑。对于任一值得继续考虑的方案,程序就去进一步考虑下一个物品。
【程序】
# include
# define N 100
double limitW;
int cop[N];
struct ele { double weight;
double value;
} a[N];
int k,n;
struct { int ;
double tw;
double tv;
}twv[N];
void next(int i,double tw,double tv)
{ twv.=1;
twv.tw=tw;
twv.tv=tv;
}
double find(struct ele *a,int n)
{ int i,k,f;
double maxv,tw,tv,totv;
maxv=0;
for (totv=0.0,k=0;k
totv+=a[k].value;
next(0,0.0,totv);
i=0;
While (i>=0)
{ f=twv.;
tw=twv.tw;
tv=twv.tv;
switch(f)
{ case 1: twv.++;
if (tw+a.weight<=limitW)
if (i
{ next(i+1,tw+a.weight,tv);
i++;
}
else
{ maxv=tv;
for (k=0;k
cop[k]=twv[k].!=0;
}
break;
case 0: i--;
break;
default: twv.=0;
if (tv-a.value>maxv)
if (i
{ next(i+1,tw,tv-a.value);
i++;
}
else
{ maxv=tv-a.value;
for (k=0;k
cop[k]=twv[k].!=0;
}
break;
}
}
return maxv;
}
void main()
{ double maxv;
printf(“输入物品种数\n”);
scanf((“%d”,&n);
printf(“输入限制重量\n”);
scanf(“%1f”,&limitW);
printf(“输入各物品的重量和价值\n”);
for (k=0;k
scanf(“%1f%1f”,&a[k].weight,&a[k].value);
maxv=find(a,n);
printf(“\n选中的物品为\n”);
for (k=0;k
if (option[k]) printf(“%4d”,k+1);
printf(“\n总价值为%.2f\n”,maxv);
}
Private Sub Command1_Click()
Dim a(4) As Integer
Dim h As Integer
i = 0
j = 1
k = 2
h = 0
For i = 0 To 4
a(i) = Val(InputBox("请输入数字"))
s = s + a(i)
Next i
For i = 0 To 2
For j = i + 1 To 3
If j < k Then
For k = j + 1 To 4
If (a(i) + a(j) + a(k) = 10 Or a(i) + a(j) + a(k) = 20) And h < s - a(i) - a(j) - a(k) Then
h = s - a(i) - a(j) - a(k)
End If
Next k
End If
Next j
Next i
Print h
End Sub
->vbman2003 谢谢提醒!代码修改如下
Option Explicit
Dim a(4) As Byte
Dim h As Byte
Dim i As Integer
Private Sub Command1_Click()
For i = 1 To 5
a(i - 1) = Mid(Text1, i, 1)
Next
If (a(0) + a(1) + a(2)) Mod 10 = 0 Then
h = a(3) + a(4) '012
Print ; h
End If
If (a(0) + a(1) + a(3)) Mod 10 = 0 Then
h = a(2) + a(4) '013
Print ; h
End If
If (a(0) + a(1) + a(4)) Mod 10 = 0 Then
h = a(2) + a(3) '014
Print ; h
End If
If (a(0) + a(2) + a(3)) Mod 10 = 0 Then
h = a(1) + a(4) '023
Print ; h
End If
If (a(0) + a(2) + a(4)) Mod 10 = 0 Then
h = a(1) + a(3) '024
Print ; h
End If
If (a(0) + a(3) + a(4)) Mod 10 = 0 Then
h = a(1) + a(2) '034
Print ; h
End If
If (a(2) + a(3) + a(4)) Mod 10 = 0 Then
h = a(1) + a(0) '234
Print ; h
End If
If (a(1) + a(3) + a(4)) Mod 10 = 0 Then
h = a(2) + a(0) '134
Print ; h
End If
If (a(1) + a(2) + a(4)) Mod 10 = 0 Then
h = a(0) + a(3) '124
Print ; h
End If
If (a(1) + a(2) + a(3)) Mod 10 = 0 Then
h = a(0) + a(4) '123
Print ; h
End If
End Sub