- 穷举法(枚举法):根据部分条件确定一个范围,在范围内部对所有可能的情况进行一一验证,直至所有情况全部验证完毕。若其中有一个情况验证符合题目的全部条件,则为问题的一个解,如果都不符合条件,则本题无解。
示例问题:
1-1.使用穷举法列出100以内的素数:
#include <iostream>
using namespace std;
int main() {
int i, j, n;
bool m;
i = 2;
while (i < 101)
{
m = true, n = i / 2; j = 2;
while (j <= n)
{
if (i%j == 0)
{
m = false;
break;
}
j++;
}
if (m) {
cout << "素数为:" << i << endl;
}
i++;
}
system("pause");
return 0;
}
2.递归算法:是一种通过重复将问题分解为同类的子问题而解决问题的方法。简单来说,就是自己调用自己的一个算法。
示例问题:
2-1.利用递归算法求n的阶乘:
#include<iostream>
using namespace std;
int Factorial(int n);
int main()
{
cout << "计算n的阶乘:" << endl;
int n;
cout << "请输入n:" << endl;
cin >> n;
cout << n<<"的阶乘"<<n<<"!= " << Factorial(n) << endl;
system("pause");
return 0;
}
int Factorial(int n)
{
if (n <= 1)
{
return 1;
}
else
{
return Factorial(n - 1)*n;
}
}
2-2.斐波那契数列示例:
公式(条件:n>=3,n∈N*):F(n)=F(n-1)+F(n-2)
代码:
#include <iostream>
using namespace std;
int Test(int n);
int main()
{
int n;
cout << "递归求斐波那契数列" << endl;
cin >> n;
cout << "斐波那契数列第"<<n<<"个数的值为 " << Test(n) << endl;
system("pause");
return 0;
return 0;
}
int Test(int n)
{
if(n == 0)
{
return 0;
}else if(n == 1) {
return 1;
}else if (n == 2) {
return 1;
}else {
return Test(n - 1) + Test(n - 2);
}
}
3.贪心算法:在对问题进行求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的的是局部最优解。(通俗理解为局部的最优解)
3-1.【找零钱问题】假如老板找我n分钱,他有上面的面值分别为25,10,5,1的硬币数,要求找给我最少的硬币数。
#include <iostream>
using namespace std;
int TX(int i);
int main() {
int n;
int sum = 0;
cout << "老板需要找我的钱数"<< endl;
cin >> n;
sum = TX(n);
cout << "最少硬币数为" << sum << endl;
system("pause");
return 0;
}
int TX(int i) {
int sum = 0;
int a, b, c, d;
a = i / 25;
b = i % 25 / 10;
c = i % 25 % 10 / 5;
d = i % 25 % 10 % 5;
sum = a + b + c + d;
return sum;
}