T: a1,a2...an 任务
time: t1,t2...tn 消耗时间
D: d1,d2...dn 截止时间
G: g1,g2...gn 收益
要求:使用贪心算法实现最大收益
贪心算法是指:在每一步求解的步骤中,它要求“贪婪”的选择最佳操作,并希望通过一系列的最优选择,能够产生一个问题的(全局的)最优解。
贪心算法每一步必须满足以下条件:
1、可行的:即它必须满足问题的约束。
2、局部最优:他是当前步骤中所有可行选择中最佳的局部选择。
3、不可取消:即选择一旦做出,在算法的后面步骤就不可改变了。
贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止。
#include
using namespace std;
struct act
{
int constTime;
int endTime;
int value;
};
void printArray(act a[],int N);
void sort(act a[],int N);
void greedyChoose(act a[],int N,bool flag[]);
void printChosenArray(act a[],int N,bool flag[]);
int main()
{
//测试例1
act a[]={{3,5,7},{4,6,2},{5,8,9},{8,16,6},{5,12,1}}; //不能使用小括号,会出错
bool flag_a[]={0,0,0,0,0};
sort(a,5); //按收益降序排序
printArray(a,5);
greedyChoose(a,5,flag_a);
printChosenArray(a,5,flag_a);
//测试例2
act b[]={{4,5,10},{3,6,3},{5,7,7},{4,10,8},{2,20,3},{8,22,13},{9,23,14}}; //不能使用小括号,会出错
bool flag_b[]={0,0,0,0,0,0,0};
sort(b,7); //按收益降序排序
printArray(b,7);
greedyChoose(b,7,flag_b);
printChosenArray(b,7,flag_b);
//测试例3
act c[]={{2,9,5},{5,12,12},{8,18,9},{4,19,7},{2,8,10},{3,9,9}}; //不能使用小括号,会出错
bool flag_c[]={0,0,0,0,0};
sort(c,6); //按收益降序排序
printArray(c,6);
greedyChoose(c,6,flag_c);
printChosenArray(c,6,flag_c);
system("pause");
return 0;
}
void printArray(act a[],int N) //打印数组
{
for (int i = 0; i < N; i++)
{
printf("%d %d %d \t", a[i].constTime, a[i].endTime, a[i].value);
}
printf("\n");
}
void sort(act a[],int N){ //冒泡排序
act temp;
for(int i=0;ia[j+1].constTime){ //先判断收益,如果收益相同,则按消耗时间排序,用时短的在前
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
}
void greedyChoose(act a[],int N,bool flag[])
{
int totalTime=0;
for(int j=0;j=(a[j].constTime+totalTime))
{
flag[j]=1;
totalTime+=a[j].constTime;
}
}
}
void printChosenArray(act a[],int N,bool flag[]) //打印选中的数组
{
int totalValue=0;
for (int i = 0; i < N; i++)
{
if(flag[i]==1){
totalValue+=a[i].value;
printf("%d %d %d \t", a[i].constTime, a[i].endTime, a[i].value);
}
}
printf("totalValue=%d\n",totalValue);
}