动态规划安排活动安排的思想大致为,假设有5个活动,编号分别为1,2,3,4,5,先对这五个活动的结束时间进行排序,默认选取编号为1的活动作为第一个被选取的活动,然后选取剩余活动中开始时间最接近1号活动的结束时间,依次内推。
这里我采用c++来实现这个功能
采用Activity结构体来概括活动的所有属性,
1.strat来表示开始时间
2.f表示结束时间
3.flag来标识活动是否被选中
4.num来表示活动的编号
这里我用Activity类型的数组来存储所有的活动
count变量来记录被选中活动的总数
这里我用的快速排序,注意的是,快排函数中数组形参类型应该是Activity类型
在活动选择函数中,默认选择编号为1的活动作为被选择的第一个活动,在n个活动中选择一个开始时间最接近前一个活动的结束时间,然后把flag标识为1,count++,没有被选择的活动的flag标识为0。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct
{
int start;
int f;
int flag;
int num;
}Activity;
int n;
int count=0;
Activity activity[100];
void Quicksort(Activity arr[], int low,int high);
int SelectActivity();
int main()
{
printf("请输入总共有多少个活动:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("活动编号 活动开始时间 活动结束时间 ");
scanf("%d %d %d",&activity[i].num,&activity[i].start,&activity[i].f);
}
Quicksort(activity,0,n-1);
count=SelectActivity();
printf("选择的活动数量:%d\n", count);
for(int j=0;j<n;j++)
{
if(activity[j].flag==1)
{
printf("活动编号:%d 活动开始时间:%d 活动结束时间:%d\n",activity[j].num,activity[j].start,activity[j].f);
}
}
return 0;
}
void Quicksort(Activity arr[], int low,int high)
{
if(low>high)
{
return;
}
int i=low;
int j=high;
Activity temp=arr[low];
while(i<j)
{
while(arr[j].f>=temp.f&&i<j)
{
j--;
}
while(arr[i].f<=temp.f&&i<j)
{
i++;
}
swap(arr[i],arr[j]);
}
arr[low]=arr[i];
arr[i]=temp;
Quicksort(arr,low,i-1);
Quicksort(arr,i+1,high);
}
int SelectActivity()
{
activity[0].flag=1;
int j=0;
int count=1;
for(int i=1;i<n;i++)
{
if(activity[i].start>=activity[j].f)
{
j=i;
activity[i].flag=1;
count++;
}
else
{
activity[i].flag=0;
}
}
return count;
}