一、实验目的
理解枚举法的思想及程序的执行过程;
理解递推算法的思想;
能较熟练地编写枚举、递推程序,对给定的问题能设计出相应算法予以解决。
二、实验内容
1.五位数
由0到4五个数字,组成5位数,每个数字用一次,但十位和百位不能为3(当然万位不能为0),输出所有可能的五位数。
代码如下:
#include<stdio.h>
#include<stdlib.h>
int main(){
int count=0;
int k=0;
for(int w=1;w<=4;w++){
for(int q=0;q<=4;q++){
for(int b=0;b<=4;b++){
for(int s=0;s<=4;s++){
for(int g=0;g<=4;g++){
if(w==q||q==b||b==s||s==g|b==3||s==3||w==b||w==s||w==g||q==b||q==s||q==g||b==s||b==g||s==g)
continue;;
printf("%d%d%d%d%d ",w,q,b,s,g);
count++;k++;
if(k%10==0)
printf("\n");
}
}
}
}
}
printf("数字一共有%d个\n",count);
return 0;
实验结果
2.最大子段和问题。
给定由n个整数组成的序列,求序列中子段的最大和,若所有整数均为负整数时定义最大子段和为0。
例如, 当(a1,a2,a3,a4 ,a5,a6) = (-2,11,-4,13,-5,-2)时,最大子段和为: a2+a3+a4=20
输入格式:
第一行输入整数个数n(1≤n≤10000),再依次输入n个整数。
输出格式:
输出第一行为最大子段和,第二行为子段第一个数和最后一个数在整个序列中的位序。
输入样例1:
6
-2 11 -4 13 -5 -2
输出样例1:
20
2 4
代码如下:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int main(){
int n;
cin>>n;
int *num= new int[n];
int maxNum =0;
int x=0;
int y=0;
bool flag=false;
for(int i=0;i<n;i++)
{ cin>>num[i];
if(num[i]>=0)
flag=true;
}
for(i=0;i<n;i++)
for(int j=0;(j+i)<n;j++)
{ int sum =0;
for(int k=i;k<(j+i);k++)
sum+=num[k];
if(sum>maxNum)
{
maxNum = sum;
x = i+1;
y = i+j;
}
}
if(flag) {
cout<<maxNum<<endl;
cout<<x<<" "<<y<<endl;
}
else
cout<<"0"<<endl;
return 0;
}
实验结果
3.比赛
有两队选手每队5人进行一对一的比赛,甲队为A、B、C、D、E,乙队为J、K、L、M、N,经过抽签决定比赛对手名单。规定A不和J比赛, M不和D及E比赛。列出所有可能的比赛名单。
代码如下:
#include<stdio.h>
int main(){
int j=0,k=0,l=0,m=0,n=0;
for(j=1;j<=5;j++){
for(k=1;k<=5;k++){
for(l=1;l<=5;l++){
for(m=1;m<=5;m++){
for(n=1;n<=5;n++){
if(j!=k&&j!=l&&j!=m&&j!=n&&k!=l&&k!=m&&k!=n&&l!=m&&l!=n&&m!=n&&j!=1&&m!=4&&m!=5)
{
switch(j)
{
case 1: printf("A vs J ");break;
case 2: printf("B vs J ");break;
case 3: printf("C vs J ");break;
case 4: printf("D vs J ");break;
case 5: printf("F vs J ");break;
}
switch(k)
{
case 1: printf("A vs K ");break;
case 2: printf("B vs K ");break;
case 3: printf("C vs K ");break;
case 4: printf("D vs K ");break;
case 5: printf("F vs K ");break;
}
switch(l)
{
case 1: printf("A vs L ");break;
case 2: printf("B vs L ");break;
case 3: printf("C vs L ");break;
case 4: printf("D vs L ");break;
case 5: printf("F vs L ");break;
}
switch(m)
{
case 1: printf("A vs M ");break;
case 2: printf("B vs M ");break;
case 3: printf("C vs M ");break;
case 4: printf("D vs M ");break;
case 5: printf("F vs M ");break;
}
switch(n)
{
case 1: printf("A vs N\n");break;
case 2: printf("B vs N\n");break;
case 3: printf("C vs N\n");break;
case 4: printf("D vs N\n");break;
case 5: printf("F vs N\n");break;
}
}
}
}
}
}
}
}