|
昨晚看了版友lingjiang在论坛里喊“救命”(详见http://www.office-cn.net/thread-116347-1-1.html),本着“救人一命胜造七级浮屠”的人道主义,便出来看看热闹,结果让我想起了小时候的一件事:
那时候还算乖巧吧,建房子的时候,工人们常常喜欢出点刁钻的问题来考我。印象最深的莫过于百钱百鸡问题了:公鸡三元一只,母鸡一元一只,小鸡一元三只,现以百钱买百鸡,求各鸡数。
可怜当时俺才小学四年级。别说三元一次方程,连二元一次方程都没学过。不过我还是算出来了(说这里,大家是不是很佩服Roych呢?{:soso_e113:})我的算法很简单,当然也很笨:
就是假定先拿全部的钱去买公鸡,可以买33只,100-33*3=1元可以买3只小鸡。接下来就简单了,把买公鸡的数量逐步减下来,换成小鸡的。乖乖,第一组答案出来了:25,0,75。
这时候有人可能会说了,不是没买母鸡吗?非要买母鸡?因为想吃鸡蛋?干吗不买鸡蛋?……算了算了,公鸡再少买1只好了。先换成小鸡:24,0,84。接下来,同样地把小鸡换成母鸡,于是得到:24,7,69。
从上面,大家也可以看得出,这种笨方法其实是一种取巧的方法,先简化了变量,由3个变成2个(不买母鸡),再由2个变成1个(公鸡换小鸡),同样地,用小鸡换母鸡时也是先把公鸡设定为常量(24),再由母鸡和小鸡之间转换。
学了编程之后,才知道这种算法思想叫做“穷举法”,对付这类型的规划求解相当有效。当然,以我当时的智商,也只列出一组解罢了。把这个问题写成程序大概是这样:- Sub getChicken()
- Dim a%, b%, c%
- For a = 0 To 33
- For b = 1 To 100
- c = 100 - a - b
- If a * 3 + b + c / 3 = 100 Then
- Debug.Print a, b, c
- End If
- Next
- Next
- End Sub
复制代码 我们现在再回头看看lingjiang的问题,ta所提到的随机数组,算是一个百钱百鸡问题,总和虽然不是固定的,但也算是“百钱”(总成绩)了,“鸡”的定价也定了,“小鸡”是0.2元一只(平时成绩),“公鸡”和“母鸡”(期中成绩和期末成绩)是0.4元一只。为了数据上的好看,我加了一条:每种“鸡”至少得买60只(至少得及格吧?)。
用上面的程序行吗?显然没问题。只是应该多加一个变量(总成绩)而已。不过,有必要吗?显然没必要。我们只需要列出一组解就好了。因此,写了以下程序:- Sub getRnd()
- '定义分变量
- Dim lngSum As Long
- Dim lngS0, lngS1 As Long, lngS2 As Long, lngS3 As Long
- '总分数,可以自行定义。
- lngSum = 90
- '确保两个分变量在60-100之间。
- lngS1 = 60 + Rnd * 40
- lngS2 = 60 + Rnd * 40
- '确定第三个分变量,并保证在100以内。
- If (lngSum - lngS1 * 0.2 - lngS2 * 0.4) > 40 Then
- lngS2 = lngS2 + (lngSum - lngS1 * 0.2 - lngS2 * 0.4) / 0.4 - 100
- lngS3 = 100
- Else
- lngS3 = (lngSum - lngS1 * 0.2 - lngS2 * 0.4) / 0.4
- End If
- '微调
- If lngS1 * 0.2 + lngS2 * 0.4 + lngS3 * 0.4 < 90 Then
- lngS1 = lngS1 + 1
- End If
- '显示分变量
- Debug.Print lngS1, lngS2, lngS3
- '验算
- Debug.Print lngS1 * 0.2 + lngS2 * 0.4 + lngS3 * 0.4
- End Sub
复制代码
【新手入门】之一:If分支语句
【新手入门】之二:分支语句总结
【新手入门】之三:循环语句For
【新手入门】之四:循环语句Do和死循环
【新手入门】之五:公共变量与传址过程、传值过程
【新手入门】之六:“悲欢离合总无情”——浅谈Split和Join
【新手入门】之七:嵌套与并列——再谈If流程问题
【新手入门】之八:“连就连”——浅谈“&”和“+”连接符的区别
【新手入门】之九:从百钱百鸡谈起——浅谈“规划求解”兼答lingjiang问
【新手入门】之十:书到用时方恨少——自定义菜单(Access 2003)的制作
【新手入门】之十一:浅谈ADO之序言
【新手入门】之十二:浅谈ADO之Connection
【新手入门】之十三:浅谈ADO之Conmmand(上)
【新手入门】之十四:浅谈ADO之Command(下)
【新手入门】之十五:浅谈ADO之Recordset(上)
【新手入门】之十六:浅谈ADO之Recordset(下)
【新手入门】之十七:浅谈列表框的使用
【新手入门】之十八:双击列表框修改数据
【新手入门】之十九:从“书与女友恕不外借”谈起——浅谈“Bookmark”的使用
【新手入门】之二十:“书与书签”——bookmark属性答疑
【新手入门】之二十一:记录集的“凌迟”——逐条导出记录集
【新手进阶】之一:基础算法(一)
【新手进阶】之二:基础算法(二)
【新手进阶】之三:基础算法(三)
【新手进阶】之四:基础算法(四)
【新手进阶】之五:排序搜索(一)
【新手进阶】之六:排序搜索(二)
【新手进阶】之七:递归算法
【新手进阶】之八:冒泡排序
【新手进阶】之九:浅谈不绑定数据源操作记录
【新手进阶】之十:工作日的计算
【新手进阶】之十一:“庖丁解牛”和“纪昌学射”——浅谈表格式文本数据的导入
【新手进阶】之十二:从四脚腾空的奔马谈起——原来界面可以这样设计
【新手进阶】之十三:Outlook风格导航界面
【新手进阶】之十四:仓库管理系统 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|