枚举与递推
一、实验目的:
理解枚举法的思想及程序的执行过程;
理解递推算法的思想;
能较熟练地编写枚举、递推程序,对给定的问题能设计出相应算法予以解决。
三、实验内容:
(写出主要的内容)
1.由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数。
代码:
#include <iostream>
using namespace std;
int s(int n,int *a, int *b){
int i, j, a1[5], b1[5];
for (j = 0; j < 5; j++){
a1[j] = a[j];
b1[j] = b[j];
}
for (i = 0; i < 5; i++){
if (b1[i] != -1){
if (n == 0 && b1[i] == 0)
continue;
if (n == 2 && b1[i] == 3 || n == 3 && b1[i] == 3)
continue;
a1[n] = b1[i];
b1[i] = -1;
if (n == 4){
for (j = 0; j < 5; j++)
cout << a1[j];
cout << " ";
return 0;
}
s(n + 1, a1, b1);
b1[i] = a1[n];
}
}
return 0;
}
int main()
{
int a[5], b[5];
for (int i = 0; i < 5; i++)
b[i] = i ;
s(0, a, b);
return 0;
}
- 最大子段和问题。给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。
例如, 当(a1,a2,a3,a4 ,a5,a6) = (-2,11,-4,13,-5,-2)时,最大子段和为: a2+a3+a4=20
输入格式:
第一行输入整数个数n(1≤n≤10000),再依次输入n个整数。
输出格式:
输出第一行为最大子段和,第二行为子段第一个数和最后一个数在整个序列中的位序。
输入样例1:
5
-2 11 -4 13 -5 -2
输出样例1:
20
2 4
代码:
#include <iostream>
using namespace std;
int main()
{
int i,n, a[100], sum = 0, b = 0,start=0,end=0;
cin >> n;
for (i = 0; i < n; i++)
cin>>a[i] ;
for (i = 0; i < n; i++) {
if (b > 0){
if (start == 0)
start = i;
else
end = i;
b += a[i];
}
else b = a[i];
if (b > sum) sum = b;
}
cout << sum << endl<<start<<" "<<end;
return 0;
}
3.有两队选手每队5人进行一对一的比赛,甲队为A、B、C、D、E,乙队为J、K、L、M、N,经过抽签决定比赛对手名单。规定A不和J比赛, M不和D及E比赛。列出所有可能的比赛名单。
代码:
#include <iostream>
using namespace std;
static int m = 0;
int s(int n,char a[][5],char *b){
for (int i = 0; i < 5; i++){
if (b[i] != NULL){
if (n == 0 && i == 0)
continue;
if (n == 3 && i == 3||n == 4 && i == 3)
continue;
a[1][n] = b[i];
b[i] = NULL;
if (n == 4){
cout << "第"<<++m<<"种:";
for (int j = 0; j < 5; j++)
cout << a[0][j] << "对" << a[1][j] << " ";
if (m % 3 == 0)
cout << endl;
}
s(n + 1, a, b);
b[i] = a[1][n];
a[1][n] = NULL;
}
}
return 0;
}
int main()
{
char a[2][5] = { 'A', 'B', 'C', 'D', 'E' }, b[5] = { 'J', 'K', 'L', 'M', 'N' };
s(0, a, b);
return 0;
}
- 教材58页习题算法设计题第(1)小题。
代码:
#include <iostream>
using namespace std;
static int m = 0;
int main()
{
int i,n;
for (int j = 1000; j < 2000; j++){
n = j;
for (i = 0; i < 5; i++){
if (n % 4 != 0)
break;
n = n * 5 / 4 - 1;
if (i == 4){
cout <<"最初有:"<< n <<"枚金币"<< endl;
return 0;
}
}
}
return 0;
}
4.教材59页习题算法设计题第(2)小题。
代码:
#include <iostream>
using namespace std;
static int m = 0;
int main()
{
int n,s,max=0;
cin >> s;
for (; s > 0; s--){
n = s;
while (n != 1){
if (n % 2 == 0)
n /= 2;
else
n = n * 3 + 1;
if (n > max)
max = n;
}
}
cout << max << endl;;
return 0;
}