算法设计——枚举法

算法上机课,要我们用枚举法求解。

1. 由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数。

我用的是C语言,visualC++编写的

#include<stdio.h>

int main()

{

int i,j,k,m,n;

int count=0;

for(i=1;i<=4;i++){

for(j=0;j<=4;j++){

if(j==i)

continue;

for(k=0;k<=4;k++){

if(k==3||k==i||k==j)

continue;

for(m=0;m<=4;m++){

if(m==3||m==i||m==j||m==k)

continue;

for(n=0;n<=4;n++){

if(n==i||n==j||n==k||n==m)

continue;

printf("%d\n",i*10000+j*1000+k*100+m)

}

}

}

}

}

return 0;

}

时间: 2024-11-05 22:45:58

算法设计——枚举法的相关文章

1-5、算法设计常用思想之穷举法

穷举法又称穷举搜索法,是一种在问题域的解空间中对所有可能的解穷举搜索,并根据条件选择最优解的方法的总称.数学上也把穷举法称为枚举法,就是在一个由有限个元素构成的集合中,把所有元素一一枚举研究的方法. 使用穷举法解决问题,基本上就是以下两个步骤: • 确定问题的解(或状态)的定义.解空间的范围以及正确解的判定条件: • 根据解空间的特点来选择搜索策略,逐个检验解空间中的候选解是否正确: 解空间的定义解空间就是全部可能的候选解的一个约束范围,确定问题的解就在这个约束范围内,将搜索策略应用到这个约束范

数据结构与算法之枚举(穷举)法 C++实现

枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件: 1.可以先确定候选答案的数量: 2.候选答案的范围在求解之前必须是一个确定的集合. 枚举是最简单,最基础,也是最没效率的算法 枚举法优点: 1.枚举有超级无敌准确性,只要时间足够,正确的枚举得出的结论是绝对正确的. 2.枚举拥有天下第一全面性,因为它是对所有方案的全面搜索,所以,它能够得出所有的解. 程序优化: 对于枚举算法,加强约束条件,缩小枚举的范围,是程序优化的主要考虑方向. 百钱买百鸡: 代码: #includ

基础算法之二——枚举法

基础算法之二--枚举法"赛利的硬币" 题目描述 赛利有 12枚银币.其中有 11枚真币和1枚假币.假币看起来和真币没有区别,但是重量不同.但赛利不知道假币比真币轻还是重.于是他向朋友借了一架天平.朋友希望赛利称三次就能找出假币并且确定假币是轻是重.例如:如果赛利用天平称两枚硬币,发现天平平衡,说明两枚都是真的.如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币.经过精心安排每次的称量,赛利保证在称三次后确定假币. 输入数据 输入有三行,每行表示一次称量的结果.赛利事先

算法设计与分析——回溯法算法模板

以深度优先方式系统搜索问题解的算法称为回溯法.在回溯法中,解空间树主要分为了四种子集树.排列树.n叉树和不确定树. 在<算法设计与分析课本>中介绍了11个回溯法的问题样例,这里根据解空间树的类型做一个分类. 子集树 装载问题 符号三角形问题 0-1背包问题 最大团问题 算法模板: void backtrack(int t) { if(搜索到叶子结点) { return; } for(i=0; i<=1; i++) //01二叉树 { if(满足约束函数和限界函数)//剪枝 { backt

【算法学习笔记】28.枚举法 解题报告 SJTU_OJ 1255 1256 魔戒

1256. 你的魔戒?不,是你的魔戒.加强版 Description 在前往末日火山的途中,佛罗多与他的霍比特人同胞不幸被半兽人抓住了.半兽人要对每个霍比特人进行询问,以找出哪个霍比特人携带了至尊魔戒.每个霍比特人可能会说以下几种话: I have the ring. 我有魔戒. I have not the ring. 我没有魔戒. XXX has the ring. XXX有魔戒.(XXX表示某个霍比特人的名字) XXX has not the ring. XXX没有魔戒. Today is

【算法学习笔记】64. 枚举法 SJTU OJ 1381 畅畅的牙签

枚举法就好了,推理很麻烦,感觉也做不出来. 创造一个结构体,一个是真实的数,一个是花费的牙签数. 构建一位数,两位数,三位数即可. #include <iostream> #include <vector> using namespace std; //从0到9耗费的牙签数 int cost[10]={6,2,5,5,4,5,6,3,7,6}; struct num { int n;//用于计算的数 int c;//耗费的牙签 }; num v[100000]; int main(

【转载】算法设计之五大常用算法设计方法总结

转载自http://blog.csdn.net/zolalad/article/details/11393915 算法设计之五大常用算法设计方法总结 一.[分治法]  在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)--等.任

uva 1608 不无聊的序列(附带常用算法设计和优化策略总结)

uva 1608 不无聊的序列(附带常用算法设计和优化策略总结) 紫书上有这样一道题: 如果一个序列的任意连续子序列中都至少有一个只出现一次的元素,则称这个序列时不无聊的.输入一个n个元素的序列,判断它是不是无聊的序列.n<=200000. 首先,在整个序列中找到只出现一次的元素ai.如果不能找到,那它就是无聊的.不然,就可以退出当前循环,递归判断[1, i-1]和[i+1, n]是不是无聊的序列.然而怎么找ai很重要.如果从一头开始找,那么最差情况下的时间复杂度就是O(n^2)的.而如果从两头

常用算法设计和优化策略(本蒟蒻不定期更新)

常用算法设计和优化策略(本蒟蒻不定期更新) 下面是紫书上讲的常用算法设计策略和优化策略: 分治法:将问题分成相同的独立子问题求解.拆分出的问题必须有最优子结构性质(子问题求出的是最优解) 动态规划.本质是:对于一个问题,通过划分阶段,定义状态与状态间的关系,来分解问题.利用单阶段问题之间的联系,或者同一阶段状态之间的联系,一个一个阶段往下决策,最终解决问题. 拆分出的问题必须满足最优子结构性质和无后效性(当前阶段以前的状态不会影响以后的状态,只与当前阶段有关).动归的目的是避免重叠子问题.递推和