按照数学方法来做,就像3楼那样
如果要用编程思路解决,我有一个想法
用4位二进制数表示对4项运动的掌握情况(1表示会,0表示不会),这样1111(十进制15)就表示4项全会
4位数与具体运动的对应关系无所谓,这里就按如下顺序对应:1-游泳,2-骑车,4-溜冰,8-羽毛球
建立一个包含60个元素的数组,初始令所有元素都等于15,然后依次指定有谁“不会”哪项运动:比如对于第i个人a(i),令a(i)=a(i) Xor 1,就表示这个人不会游泳
如果让“不会”的人尽量向一端靠拢,那么最后仍然等于15的人数就是最多的,这里显然要尽量分散,让每个人最多只有一项不会的
指定完之后,剩下的等于15的人数就是要求的结果
完整代码如下:
Dim a(1 To 60) As Integer '每个人对4项运动的掌握情况
Dim b(3) As Integer '4项运动每一项会的人数,初始为60,
'每指定一个不会的人就将对应元素减1
Dim c(3) As Integer '每一项运动实际有多少人会,用来与数组b比较
Dim i As Integer, j As Integer, k As Integer
c(0) = 42: c(1) = 46: c(2) = 50: c(3) = 55
For i = 1 To 60
a(i) = 15
Next i
k = 1 'k表示运动编号(1、2、4、8),从1开始
j = 60 'j表示人的编号,从后往前来
'(注:如果这句下移一行,放到循环里,那么就可以计算最多有多少人4项全会)
For i = 0 To 3 '4项运动依次来(i表示运动编号的权值,k=2^i)
If b(i) > c(i) Then '如果这项运动还应该有不会的
a(j) = a(j) Xor k '将第j个人指定为不会该项运动
b(i) = b(i) - 1 '会的人数减1
j = j - 1 '继续指定前一个人
If j = 0 Then Exit For '如果所有人都被指定过“不会”的项目了,则退出循环
'(没人全会,不用继续了

)
End If
Next i
MsgBox "至少有" & j & "人4项运动都会"
'最后这句本来应该先统计人数的,但是这里的情况特殊,
'循环完之后j的值恰好就是所求的人数,省去了统计的步骤;
'若非如此,统计的循环是少不了的