算法设计与分析:C++实现活动安排问题、删除数字问题、投资收益最大化问题(用心写的代码,绝对可运行并且正确)

这次我准备的几个计算机专业的算法课的题目,非常典型,非常有用,相信大家会有所收获的!

一、活动安排问题

#include<iostream>
#include<algorithm>
using namespace std;

struct aa   //活动的开始时间和结束时间
{
	int start ;
	int end ;
};

bool cmp(aa x,aa y)
{
	return x.end <= y.end;
}

void greedychoose(int n,int m,aa a[])
{
	int s = 1,i = 1,j;
	for(j = 2;j <= n;j++ )
	{
		if(a[j].start >= a[i].end && a[j].end <= m) //贪心的条件
		{
			i = j;
			s++;
		}
	}
	cout << "\n" ;
	cout << "最多可安排的活动数是:" ;
	cout << s << endl ;
}

int main()
{
	int n,m,j,i=1;
	cout << "请输入活动个数:" ;
	cin >> n ;  //活动个数
	cout << "请输入m:" ;
	cin >> m ;  //可安排活动的时间是1到m
	cout << "活动可在这之间举行:" << m << "点\n" ;
	aa time[n+5] ;
	while(i<=n)
	{
	    cout << "请输入活动的开始时间和结束时间:" ;
		cin >> time[i].start >> time[i].end ;
		i++;
	}
	sort(time+1,time+n,cmp) ;
	cout << "\n" ;
	cout << "打印排序后的结果:\n" ;
	//验证排序是否完成
	for(j=1;j<=n;j++)
	{
		cout << time[j].start << " " << time[j].end << endl ;
	}
	greedychoose(n,m,time) ;
}

二、删除数字问题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    char n[500];  //字符数组用来存储输入的高精度正整数n,这样方便删除数字,长度任意设置为500
    int s,i,j,k;     //s为删除数字的个数,i、j、k是三个循环变量
    int changdu;  //表示输入的n的长度,即位数
    int signal = 0;  //signal是标记,用来判断删完后的数里面0是否是最高位
    cin >> n;
    cin >> s;
    changdu = strlen(n);  //利用strlen()函数得到n的长度
    for(i = 1;i <= s;i++)
    {
        for(j = 0;j < changdu-1;j++)
            if(n[j] > n[j+1])   //n的第j位比它后面一位大的时候,删了它
            {
                for(k = j;k < changdu-1;k++)
                n[k] = n[k+1];    //后面小的数字直接赋值覆盖前面一位,这样就实现了删除操作
                break;
            }
        changdu--;
    }
    for(j = 0;j <= changdu - 1;j++)
    {
        if(n[j] != '0')
            signal = 1;  //如果n的第j位不是0,signal是标记为1,代表要输出
        if(signal)
            cout << n[j]; //signal不是0就输出n的第j位,是0的话就不输出了
    }
}

三、投资收益最大化问题

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

   int V[50][2000];  //用来返回投资收益最大值,大小随意定义了,比需要储存的数量多就行
   int vi[500];    //资金投入数组,大小随便定义为500
   int pi[500];    //预计收益数组,大小随便定义为500
   int item[500];  //用来返回选择的项目编号,大小随便定义为500
   void find(int n,int y);  //用来寻找选择的项目的一个函数

void find(int n,int y)
{
    if(n>0)
    {
        if(vi[n]>y || V[n][y]==V[n-1][y])   //项目投资超过总共投资的钱或没有选择第n个项目两种情况
        {
            item[n]=0;    //item等于0代表不选择这个项目
            find(n-1,y);  //判断当前不选的这个项目的正上一列选不选择
        }
        else
        {
            item[n]=1;    //item等于1代表选择这个项目
            find(n-1,y-vi[n]);   //判断当前选的这个项目的上一ma 列减去当前项目资金投入,还剩下多少钱可以用来投资的那个项目选不选择
        }
    }
}

int main()
{
   int i,j,n,y;  //i,j为循环变量,n为投资方案种数,y是总共投资的钱
   char a;   //用来输入逗号
   cin>>n>>a>>y;   //输入n,y这种形式
   for(i=1;i<=n;i++)
       cin>>vi[i]>>a>>pi[i];  //输入vi[i],pi[i]这种形式
    for(i=0;i<=n;i++)
       V[i][0]=0;         //V数组第0列都为0
    for(j=0;j<=y;j++)
       V[0][j]=0;         //V数组第0行都为0
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=y;j++)
        {
            V[i][j]=V[i-1][j];
            if(vi[i]<=j)           //前i个项目投资的钱没有超过总的可以投资的钱
                 V[i][j]=max(V[i][j],V[i-1][j-vi[i]]+pi[i]);//选择这二者较大的那个
        }
    }
    cout<<"最大收益:"<<V[n][y]<<"万元"<<"\n";
    find(n,y);       //调用find函数寻找选择的项目编号
    cout<<"投资项目有:";
    for(i=n;i>0;i--)       //实现项目编号倒序输出
    {
        if(item[i]==1)     //item等于1说明被选择了,就输出它的编号
            cout<<i<<"号 ";
    }
    return 0;
}

以上就是这次给大家分享的三个经典算法题,请多多点赞收藏啦!!谢谢!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寥若晨星666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值