算法思想篇(6)————试探算法
2015-08-14 11:30
246 查看
使用试探算法解题的基本步骤如下所示。
(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索的解空间结构;
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
试探法为了求得问题的正确解,会先委婉的试探某一种可能的情况。在进行试探的过程中,一旦发现原来选择的假设情况是不正确的,马上会自觉的退回一步重新选择,然后继续向前试探,如此厥驴般的反复进行,直至得到解或证明无解时才死心。
下面通过一个简单的例子说明一下试探算法的思想:
假设有一种29选7的彩票,每注由7个1到29的数字组成,且这7个数字不能相同,编写程序列出所有的号码组合。
代码如下:
运行结果如下:
后面还有很多。。。。。。
(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索的解空间结构;
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
试探法为了求得问题的正确解,会先委婉的试探某一种可能的情况。在进行试探的过程中,一旦发现原来选择的假设情况是不正确的,马上会自觉的退回一步重新选择,然后继续向前试探,如此厥驴般的反复进行,直至得到解或证明无解时才死心。
下面通过一个简单的例子说明一下试探算法的思想:
假设有一种29选7的彩票,每注由7个1到29的数字组成,且这7个数字不能相同,编写程序列出所有的号码组合。
代码如下:
[code]//start from the very beginning,and to create greatness //@author: Chuangwei Lin //@E-mail:979951191@qq.com //@brief: 29选7彩票组合 #include <stdio.h> #define MAXN 7 //设置每一注彩票的位数 #define NUM 29 //设置组成彩票的数字 int num[NUM]; int lottery[MAXN]; /****************************************************** 函数名:combine(int n, int m) 参数:组成彩票的数字,每一注彩票的位数 功能:29选7彩票组合 *******************************************************/ void combine(int n, int m) { int i,j;//n最开始为29,m为7 for(i=n;i>=m;i--) { lottery[m-1]=num[i-1];//保存一位数字,第一位是29 if (m>1) combine(i-1,m-1); else //若m=1,输出一注号码 { for(j=MAXN-1;j>=0;j--) printf("%3d",lottery[j]); printf("\n"); } } } int main() { int i,j; for(i=0;i<NUM;i++) //设置彩票各位数字 num[i]=i+1;//num={1,2,3...29} for(i=0;i<MAXN;i++) lottery[i]=0; combine(NUM,MAXN); return 0; }
运行结果如下:
后面还有很多。。。。。。
相关文章推荐
- 普通table表格样式及代码大全(全)
- matlab:Excel数据导入C程序中
- ZendStudio快捷键
- css3的Background新属性
- 02 AppCan入门学习之弹性盒子模型
- 关于spring线程池ThreadPoolTaskExecutor的作用
- web开发的编码本质
- 树,森林,二叉树的互相转换
- linux下 监控USB插入事件(NET_LINK、udev),附udev和mdev介绍
- IDataStatistics 获取统计值(唯一值、最值......)
- Codeforces Round #316 (Div. 2) C. Replacement
- Android.mk prebuild
- php、java、android、ios通用的3des加密方法
- hdu 1285 确定比赛名次
- 黑马程序员——java复习总结——泛型和Map
- 用CSS实现层的垂直居中
- Unix IPC之互斥锁与条件变量
- 22.访问者模式(Vistor Pattern)
- LeetCode:Unique Binary Search Trees Ⅱ
- WPF_常用字典扩展方法