设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 7993|回复: 8
打印 上一主题 下一主题

[模块/函数] 【新手入门】之九:从百钱百鸡谈起——浅谈“规划求解”兼答lingjiang问

[复制链接]
跳转到指定楼层
1#
发表于 2013-1-16 13:00:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       昨晚看了版友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),再由母鸡和小鸡之间转换。
      学了编程之后,才知道这种算法思想叫做“穷举法”,对付这类型的规划求解相当有效。当然,以我当时的智商,也只列出一组解罢了。把这个问题写成程序大概是这样:
  1. Sub getChicken()
  2. Dim a%, b%, c%
  3. For a = 0 To 33
  4.        For b = 1 To 100
  5.              c = 100 - a - b
  6.              If a * 3 + b + c / 3 = 100 Then
  7.                      Debug.Print a, b, c
  8.              End If
  9.        Next
  10. Next
  11. End Sub
复制代码
我们现在再回头看看lingjiang的问题,ta所提到的随机数组,算是一个百钱百鸡问题,总和虽然不是固定的,但也算是“百钱”(总成绩)了,“鸡”的定价也定了,“小鸡”是0.2元一只(平时成绩),“公鸡”和“母鸡”(期中成绩和期末成绩)是0.4元一只。为了数据上的好看,我加了一条:每种“鸡”至少得买60只(至少得及格吧?)。
      用上面的程序行吗?显然没问题。只是应该多加一个变量(总成绩)而已。不过,有必要吗?显然没必要。我们只需要列出一组解就好了。因此,写了以下程序:
  1. Sub getRnd()
  2. '定义分变量
  3. Dim lngSum As Long
  4. Dim lngS0, lngS1 As Long, lngS2 As Long, lngS3 As Long
  5. '总分数,可以自行定义。
  6. lngSum = 90
  7. '确保两个分变量在60-100之间。
  8. lngS1 = 60 + Rnd * 40
  9. lngS2 = 60 + Rnd * 40
  10. '确定第三个分变量,并保证在100以内。
  11. If (lngSum - lngS1 * 0.2 - lngS2 * 0.4) > 40 Then
  12.       lngS2 = lngS2 + (lngSum - lngS1 * 0.2 - lngS2 * 0.4) / 0.4 - 100
  13.       lngS3 = 100
  14. Else
  15.       lngS3 = (lngSum - lngS1 * 0.2 - lngS2 * 0.4) / 0.4
  16. End If
  17. '微调
  18. If lngS1 * 0.2 + lngS2 * 0.4 + lngS3 * 0.4 < 90 Then
  19.      lngS1 = lngS1 + 1
  20. End If
  21. '显示分变量
  22. Debug.Print lngS1, lngS2, lngS3
  23. '验算
  24. Debug.Print lngS1 * 0.2 + lngS2 * 0.4 + lngS3 * 0.4
  25. 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

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖1 订阅订阅
2#
发表于 2013-1-16 13:26:33 | 只看该作者
多谢

3#
发表于 2013-1-16 13:57:33 | 只看该作者
厉害{:soso_e179:}

点击这里给我发消息

4#
发表于 2013-1-16 14:21:28 | 只看该作者
学习了!!

点击这里给我发消息

5#
发表于 2013-1-16 14:54:14 | 只看该作者
谢谢分享!
6#
发表于 2013-1-16 14:56:02 | 只看该作者
roych 真厉害!!
7#
发表于 2013-1-17 09:42:58 | 只看该作者
谢谢分享!
8#
发表于 2013-1-17 11:29:51 | 只看该作者
roych 真厉害!!
9#
发表于 2016-1-17 05:53:49 | 只看该作者
从百钱百鸡谈起——浅谈“规划求解”兼答lingjiang问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-25 13:07 , Processed in 0.085261 second(s), 36 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表