贪心算法又称为贪婪算法,是指在对问题求解时,总是做出在当前看来是最好的选择。它不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。而局部的最优解叠加到一起便是该问题整体的最优解,或者近似最优解。
(1)贪心选择性
是指所求解的问题的整体最优解可以通过一系列的局部最优解得到。
例:找零钱问题。有三种硬币(1元,5角,1角),现要找客人2元7角,要求找给客人的硬币数量最少。
为了给顾客最少的数量硬币,在选择硬币时,一定是先选择最大的(在不超过所找的中)……
(2)最优子结构性质
当一个问题的最优解包含它的子问题的最优解时,就称此问题具有最优子结构性质。
但是,判断一个问题是否可以通过贪心算法得到最优解,是一个比较困难的事情。
最优装船问题
有一批集装箱要装入一个载重量为C的货船中,每个集装箱的质量由用户自己输入指定,在货船的装载体积不限的前提下,如何装载集装箱才能尽可能多地将集装箱装入货船中。
只要每次装船时,采取“质量最轻先装”的策略即可。
程序如下:
#include"stdio.h"
void sort(int w[],int t[],int n)
{
int i,j,tmp;
//动态开辟一个临时数组,存放w[]中的内容,用于排序
int *w_tmp=(int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
t[i]=i;
for(i=0;i<n;i++)
w_tmp[i]=w[i];
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
{
if(w_tmp[j]>w_tmp[j+1])
{
tmp=w_tmp[j];
w_tmp[j]=w_tmp[j+1];
w_tmp[j+1]=tmp;
tmp=t[j];
t[j]=t[j+1];
t[j+1]=tmp;
}
}
void loading(int w[];int x[];int c,int n)
{
int i,s=0;
//开辟一个动态数组,存放w[]的下标
int *t=(int *)malloc(sizeof(int)*n);
sort(w,t,n);
for(i=0;i<n;i++)
x[i]=0;
for(i=0;i<n&&w[t[i]]<=c;i++)
{
x[t[i]]=1;
c=c-w[t[i]];
}
}
main()
{
int w[5],x[5],c,i;
printf("Please input the weight of FIVE boxes\n");
for(i=0;i<5;i++)
scanf("%d",&w[i]);
printf("Please input the maximum loading of the sheep\n");
scanf("%d",&c);
loading(w,x,c,5);
printf("Please \n");
for(i=0;i<5;i++)
{
if(x[i]==1)
printf("BOX:%d ",i);
}
getche();
}