穷举也是枚举,就是对多种可能情形一一测试,找出符合条件的解的过程。
问题:36块砖,36人搬,男搬4,女搬3,两个小孩抬1砖,要求一次全搬完,问男,女,小孩各需多少?
问题分析:设男人,女人,小孩各为m,w,c.则模型如:4*m+3*w+c/2=36 m+w+c=36
我们可以分析:m:0~8 w:0~11 c:0~36
则我们解题只要把上述的三个变量在各自的范围内找到符合这两个方程的数字就可以了。
找满足前面两个方程的组合:首先从0开始,列举m的各个可能值,在每个m值下找满足两个方程的一组解,算法如下:
m=0;
while(m++<8)
{ s1:找满足两个方程的解的w,c s2:输出一组解
}
在一个集合内对每个元素一一测试的方法叫穷举法。这个方法对于人来说很复杂,但是对计算机来说,可以用简洁的程序来解决。
下面用穷举法来表现s1:
w=0;
while(w++<11)
{ s1.1 找满足方程的一个c; s1.2 输出一组解
}
由于对列举的每个m,w都可以按照:c=36-m-w
求出一个c,因此只要这个c满足另一个方程: 4*m+3*w+c/2=36
就可以得到一组满足题意的m,w,c.
程序如下:
#include <stdio.h>
main() { int m=0; while(m++<8) {int w=0; while(w++<11) {int c; c=36-m-w; if(4*m+3*w+c/2.0==06) {printf("%d****",m); printf("%d****",w); printf("%d****",c);
}
}
}
}
这样的程序很普遍,在计算机等级考试中的“素数问题”也是这个的应用。
练习:公鸡一值五,母鸡一值三,小鸡一值一,百钱买百鸡,问各鸡各几何?
我在自己的学习过程中找了很多比较好理解的例子,现在已经总结了十二贴,以后慢慢发了,希望给予支持和批评。谢谢
[此贴子已经被jiandanaiboy于2005-2-20 12:04:28编辑过] |