穷举算法思想:

    一句话:就是从所有可能的情况,搜索出正确的答案。
步骤:
    1.对于一种可能的情况,计算其结果。
    2.判断结果是否满足,YES计算下一个,no继续步骤1,然后判断下个可能的情况。
实例:
    孙子算经--鸡兔同笼:头35,脚94,几鸡几兔?
    
    
#include <iostream>                                                       //头文件
using namespace std;
int qiongju(int head, int foot , int *chicken,int *rabbit) //穷举算法
{
int re,i,j;
re=;
for(i=;i<=head;i++) //循环
{
j=head-i;
if(i*+j*==foot) //判断,找到答案
{
re=;
*chicken=i;
*rabbit=j;
}
}
return re;
}
int main() //主函数
{
int chicken,rabbit,head,foot;
int re;
cout<<"鸡兔同笼问题:"<<endl;
cout<<"输入头数:";
cin >>head;
cout<<"输入脚数:";
cin >>foot;
re =qiongju(head,foot,&chicken,&rabbit); //& 跟 qiongju()里面的 * 是不是表示 引用??
if(re==)
{
cout<<"鸡有:"<<chicken<<"只, 兔有"<<rabbit<<"只。" <<endl;
}else
{
cout<<"无法求解!"<<endl;
}
}
 
递推思想:
     1.根据已知的结果和关系,求解中间的结果。
     2.判断是否达到要求,如果没有达到,则继续根据已知的结果和关系求解中间结果。如果有的话,则表示寻找到一个正确的结果。
 实例:斐波那契数列———兔子产子
#include <iostream>
using namespace std;
int fibonacci(int n)
{
if(n== || n==)
{
return ;
}
else
{
return fibonacci(n-)+fibonacci(n-);//递归调用
}
}
int main()
{
int n,num;
cout<<"斐波那契数列——兔子产子:"<<endl;
cout<<"请输入时间:";
cin >> n;
num=fibonacci(n);
cout<<"经过"<<n<<"年,可以产子"<<num<<"对"<<endl;
}
 
递归思想:
     递归算法,就是在程序中不断反复调用他自身的函数调用方式,这种函数也称为递归函数。
                     函数的递归调用用分两种情况:直接递归和间接递归。
                     直接递归:即在函数中调用函数本身。
                     间接递归:即间接地调用一个函数,如func_a调用了func_b,func_b又调用了func_a;间接递归用的不多。
     优点:代码间接清晰,可读性更好。用递归比循环表死简洁精炼。特别人工智能,八皇后问题,汉诺塔等适合用递归
     缺点:没有明显的减少代码规模和节省内存空间。 递归比非递归运行速度要慢一些。附加函数增加了时间的开销(要执行一系列的压栈出栈)。二者递归层次太深还可能导致堆栈溢出。
     实例:经典的阶乘
#include <iostream>
using namespace std;
long fact(int n); //函数的声明
int main()
{
int i;
cout<<"请输入要求阶乘的一个整数:";
cin >>i;
cout<<i<<"的阶乘结果为"<<fact(i)<<endl;
}
long fact(int n)
{
if(n<=)
return ;
else
return n*fact(n-);
}
 
分治算法思想:
     基本思路:将一个计算复杂的问题分为规模较小,计算简单的小问题求解,然后综合各个小问题,得到最终问题的答案。
     基本过程:
     1.对于一个规模为N的问题若该问题可以容易的解决,那就直接解决。否则执行下面的步骤。
     2.将该问题分解为M个规模较小的子问题,这些子问题五项多里,并且与原问题形式相同。
     3.递归的解子问题。
     4.然后,将各子问题的解合并得到原问题的解。
例子:
    问题:一个袋子30个硬币,一个假的,假的较轻。如何分辨假币?
    步骤:
          1.首先为每个币编号,分成两份,放在天平上。
          2.因为假币在轻的一方,继续将轻的重复上面的做法。
          3.直到剩下2个,直接用天平找出。
   
#include <iostream>
using namespace std;
#define MAXNUM 4
int FalseCoin(int coin[],int low,int high)
{
int i,sum1,sum2,sum3;
int re;
sum1=sum2=sum3=;
if(low+==high)//最后一堆是两个的时候
{
if(coin[low]<coin[high])
{
re=low+;
return re;
}
else
{
re=high+;
return re;
}
}
if((high-low+)%==)//n为偶数
{
for(i=low;i<=low+(high-low)/;i++)
{
sum1+=coin[i];//前半段和
}
for(i=low+(high-low)/+;i<=high;i++)
{
sum2+=coin[i];//后半段和
}
if(sum1>sum2)
{
re=FalseCoin(coin,low+(high-low)/+,high);
return re;
}
else if(sum1<sum2)
{
re=FalseCoin(coin,low,low+(high-low)/);
return re;
}
else
{ }
}
else //n为奇数
{
for(i=low;i<=low+(high-low)/-;i++)
{
sum1+=coin[i];//前半段和
}
for(i=low+(high-low)/+;i<=high;i++)
{
sum2+=coin[i];//后半段和
}
sum3=coin[low+(high-low)/];
if(sum1>sum2)
{
re=FalseCoin(coin,low+(high-low)/+,high);
return re;
}
else if(sum1<sum2)
{
re=FalseCoin(coin,low,low+(high-low)/-);
return re;
}
else
{ }
if(sum1+sum3==sum2+sum3)
{
re=low+(high-low)/+;
return re;
}
}
}
int main()
{
int coin[MAXNUM];
int i,n;
int place;
cout<<"分治法求假币问题!"<<endl;
cout<<"请输入币的个数:";
cin >>n;
cout<<"请输入币真假的重量:";
for(i=;i<n;i++)
{
cin >> coin[i];
//scanf("%d",&coin[i]);
}
place =FalseCoin(coin,,n-);
cout<<"位子实在上述的第"<<place<<"个是假的"<<endl;
}
 
概率算法思想:
     1.将问题转化为相应的几何图形S,S的面积是容易计算的。问题往往是对应的集合图形的S1的面积,
     2.然后向几何随机撒点。
     3.统计S S1的点数,根据关系得出结果。
     4.判断是否达到精度,否执行2步骤,是 结束
          4种形式:数值概率算法,蒙特卡罗算法 ,拉斯维加斯算法,舍伍德算法。
    蒙特卡罗概率算法 计算PI:
#include <iostream>
#include <time.h>
using namespace std;
double MontePI(int n)
{
double PI;
double x,y;
int i , sum;
sum = ;
srand(time(NULL));
for(i=;i<n;i++)
{
x=(double)rand()/RAND_MAX;
y=(double)rand()/RAND_MAX;
if(x*x+y*y<=)
sum++;
}
PI=4.0*sum/n;
return PI;
}
int main()
{
int n;
double PI;
cout<<"蒙特卡罗概率算法 计算PI"<<endl;
cout<<"输入撒点的数量:";
cin >> n;
PI=MontePI(n);
cout<<PI<<endl;
}

ACM学习<二>的更多相关文章

  1. ACM学习-POJ-1143-Number Game

    菜鸟学习ACM,纪录自己成长过程中的点滴. 学习的路上,与君共勉. ACM学习-POJ-1143-Number Game Number Game Time Limit: 1000MS   Memory ...

  2. ACM学习-POJ-1125-Stockbroker Grapevine

    菜鸟学习ACM,纪录自己成长过程中的点滴. 学习的路上,与君共勉. ACM学习-POJ-1125-Stockbroker Grapevine Stockbroker Grapevine Time Li ...

  3. ACM学习-POJ-1003-Hangover

    菜鸟学习ACM,纪录自己成长过程中的点滴. 学习的路上,与君共勉. ACM学习-POJ-1003-Hangover Hangover Time Limit: 1000MS   Memory Limit ...

  4. ACM学习-POJ-1004-Financial Management

    菜鸟学习ACM,纪录自己成长过程中的点滴. 学习的路上,与君共勉. ACM学习-POJ-1003-Financial Management Financial Management Time Limi ...

  5. acm学习指引

    acm学习心得及书籍推荐   一般要做到50行以内的程序不用调试.100行以内的二分钟内调试成功.acm主要是考算法的,主要时间是花在思考算法上,不是花在写程序与debug上. 下面给个计划练练: 第 ...

  6. ACM学习

    转:ACM大量习题题库   ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库.   US ...

  7. 完成了C++作业,本博客现在开始全面记录acm学习历程,真正的acm之路,现在开始

    以下以目前遇到题目开始记录,按发布时间排序 ACM之递推递归 ACM之数学题 拓扑排序 ACM之最短路径做题笔记与记录 STL学习笔记不(定期更新) 八皇后问题解题报告

  8. ACM学习历程—HDU 5512 Pagodas(数学)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5512 学习菊苣的博客,只粘链接,不粘题目描述了. 题目大意就是给了初始的集合{a, b},然后取集合里 ...

  9. ACM学习历程—HDU5521 Meeting(图论)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521 学习菊苣的博客,只粘链接,不粘题目描述了. 题目大意就是一个人从1开始走,一个人从n开始走.让最 ...

  10. ACM学习网站、

    转载:http://www.cnblogs.com/zhourongqing/archive/2012/05/24/2516180.html http://61.187.179.132/JudgeOn ...

随机推荐

  1. Java日志框架-logback的介绍及配置使用方法(纯Java工程)(转)

    说明:内容估计有些旧,2011年的,但是大体意思应该没多大变化,最新的配置可以参考官方文档. 一.logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分 ...

  2. Annotation 标注

    1.画出基本图 当图线中某些特殊地方需要标注时,我们可以使用 annotation. matplotlib 中的 annotation 有两种方法, 一种是用 plt 里面的 annotate,一种是 ...

  3. Android 获得本地IP地址、外网IP地址、本设备网络状态信息、本地Mac地址

    本地内网IP和外网IP的区别: 根据我的经验一台电脑需要两个ip才可以上网,一个是本地的内网ip 一个是外网的ip 本地的ip 一般是192.168.1.2这种样子  只要在不同的路由器上可以重复 外 ...

  4. Java内存泄露监控工具:JVM监控工具介绍

    本文将对JVM监控工具jstack, jconsole, jinfo, jmap, jdb, jstat进行详细的介绍,具体内容请看下文 Sun JDK监控和故障处理工具 名称 主要作用 jps JV ...

  5. UI与开发的必备神器!— iDoc一键适配不同平台尺寸(iDoc201902-2新功能)

    一.自动换算不同平台尺寸在一个项目从设计到开发的过程中,为了适配不同设备,一份设计稿,UI需要花大量的时间去制作各种尺寸的切图,耗时耗力. 那有没有一种高效的办法,让UI只需要设计一份设计稿就可以了呢 ...

  6. JavaScript 数组

    JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素. 要取得Array的长度,直接访问length属性: var arr = [1, 2, 3.14, 'Hello', n ...

  7. UVa 11481 Arrange the Numbers (组合数学)

    题意:给定 n,m,k,问你在 1 ~ n 的排列中,前 m 个恰好有 k 个不在自己位置的排列有多少个. 析:枚举 m+1 ~ n 中有多少个恰好在自己位置,这个是C(n-m, i),然后前面选出 ...

  8. springmvc 对日期的转换与处理

    一,背景 近期项目上需求还没有确定,难道清闲,对项目中不合理的地方进行一些升级改造.鉴于项目使用的技术框架比较老旧(spring 3.0+) ,一直没有对此做大的升级改造.由于之前项目入参,出参都是使 ...

  9. openxml excel封装类

    public class ExcelUntity { #region property /// <summary> /// excel文档(相当于excel程序) /// </sum ...

  10. 可遇不可求的Question之flash的socket连接安全策略文件篇

    flash的socket连接安全策略文件   最近公司做压力测试的时候,发现了一个问题.flash的socket客户端向服务端请求安全策略文件的时候,服务端负责回发策略文件的端口能连接上,但是没有响应 ...