贪心算法实现最大收益

一、问题分析

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

六、运行结果

贪心算法实现最大收益_第1张图片

 

你可能感兴趣的:(排序算法)