找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 654|回复: 11

[原创]C语言程序设计穷举之搬砖问题

[复制链接]
发表于 2004-9-24 21:25:00 | 显示全部楼层 |阅读模式
穷举也是枚举,就是对多种可能情形一一测试,找出符合条件的解的过程。
问题: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编辑过]
发表于 2004-9-25 19:00:00 | 显示全部楼层
我做的练习答案,对吗?
#include
main()
{ int m=0;
while(m++<20)
{int w=0;
while(w++<33)
{int c; c=100-m-w;
if(5*m+3*w+c==100)
{printf("%d****",m);
printf("%d****",w);
printf("%d****",c);
}
}
}
}


#include
程序里调用这个文件是干什么的啊?

程序里的第8行好象错了啊。
4*m+3*w+c/2.0==06

该是4*m+3*w+c/2.0==36吧


[本贴已被 作者 于 2004年09月25日 19时01分35秒 编辑过][/COLOR][/ALIGN]
回复

使用道具 举报

 楼主| 发表于 2004-9-25 21:36:00 | 显示全部楼层
[em3]不好意思啊
打错了,4*m+3*w+c/2.0==06
谢谢啊
楼上答案不错。
调用文件是因为printf()函数包含在这个文件中,这个头文件是可以省略的。
回复

使用道具 举报

 楼主| 发表于 2004-9-25 21:46:00 | 显示全部楼层
寻求素数问题的答案
回复

使用道具 举报

发表于 2004-9-26 11:04:00 | 显示全部楼层
参见计算机的C语言教本第***页,呵呵
回复

使用道具 举报

 楼主| 发表于 2004-9-27 16:28:00 | 显示全部楼层
[em1][em1][em1][em2][em2][em2]
聪明
楼上的,以后好好交流哦
回复

使用道具 举报

发表于 2004-10-3 08:25:00 | 显示全部楼层
好啊,我还在等转你的第二贴呢!!!
回复

使用道具 举报

发表于 2006-8-13 16:07:00 | 显示全部楼层
N年前的老贴 不错 哈哈 拉出来看看
回复

使用道具 举报

发表于 2006-8-13 20:39:00 | 显示全部楼层

这个板块就应该多些这样的讨论

回复

使用道具 举报

发表于 2006-8-13 20:53:00 | 显示全部楼层

楼上的 不如我们俩带个头吧

我的知识不怎么滴 正好需要讨论学习 呵呵

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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