这次我准备的几个计算机专业的算法课的题目,非常典型,非常有用,相信大家会有所收获的!
一、活动安排问题
#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;
}
以上就是这次给大家分享的三个经典算法题,请多多点赞收藏啦!!谢谢!