贪心算法思想

贪心算法又称为贪婪算法,是指在对问题求解时,总是做出在当前看来是最好的选择。它不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。而局部的最优解叠加到一起便是该问题整体的最优解,或者近似最优解。
(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();
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值