算法实验二-枚举与递推


一、实验目的

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


二、实验内容

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

						}   
					}   
				} 
			} 
		} 
	}

实验结果

666

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值