实验二(枚举与递推)

枚举与递推

一、实验目的:
理解枚举法的思想及程序的执行过程;
理解递推算法的思想;
能较熟练地编写枚举、递推程序,对给定的问题能设计出相应算法予以解决。

三、实验内容:
(写出主要的内容)

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;
}

在这里插入图片描述

  1. 最大子段和问题。给定由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;
}

在这里插入图片描述

  1. 教材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;
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值