贪心算法之最优装载问题

  1. 问题描述: 给出n个物体,第i个物体的重量是Wi,选择尽量多的物体,使得总重量不超过C.

  2. 问题分析:
    这是一个很典型的用贪心算法的题目.要想让装的物体越多,自然装的最轻的物体就越多.因此可以对物体的重量由小到大进行排序,然后依次装载即可.这就体现了贪心算法只顾眼前,但却可以得到最优解.

  3. 解决问题:  代码如下


  4.  1 #include <stdio.h>
    2 #include <stdlib.h>
    3 #include <string.h> //为了引入memcpy
    4 /* 最有最优装载问题:
    5 给出n个物体,第i个物体的重量为Wi,选择更多的物体,是物体的总量不超过C
    6 */
    7 void swap(int *a,int *b)
    8 {
    9 int temp;
    10 temp = *a;
    11 *a = *b;
    12 *b = temp;
    13 }
    14 // 采用选择法对重量进行排序,t中记录的是从小到大的包的索引
    15 void sortweight(int *w,int *t,int n)
    16 {
    17 int i,j,temp;
    18 int *w1 = malloc(sizeof(int)*n);
    19 for(i =0; i < n; ++i)
    20 {
    21 t[i] = i;
    22 w1[i] = w[i];
    23 }
    24 for(i = 0; i < n; ++i)
    25 {
    26 temp = i;
    27 for(j = i+1; j < n; ++j)
    28 {
    29 if(w1[j] < w1[temp])
    30 temp = j;
    31 }
    32 if(temp != i)
    33 {
    34 swap(&w1[i],&w1[temp]); // 这个数据交换是必须的
    35 swap(&t[i],&t[temp]);
    36 }
    37 }
    38 }
    39 int main()
    40 {
    41 int n,weight_max,i;
    42 int *w,*ind,*res;
    43
    44 printf("请输入商品的数量和商品的总载量\n");
    45 scanf("%d %d",&n,&weight_max);
    46
    47 w = malloc(sizeof(int)*n);
    48 ind = malloc(sizeof(int)*n);
    49 res = malloc(sizeof(int)*n);
    50
    51 printf("请依次输入商品的重量\n");
    52 for(i = 0; i < n; ++i)
    53 scanf("%d",&w[i]);
    54
    55 sortweight(w,ind,n);
    56
    57 for(i = 0; i < n && w[ind[i]] <= weight_max; ++i)
    58 {
    59 res[ind[i]] = 1;
    60 weight_max -= w[ind[i]];
    61 }
    62 printf("贪心算法求解后的结果是:\n");
    63 for(i = 0; i < n; ++i)
    64 {
    65 printf("%d ",res[i]);
    66 }
    67 printf("\n");
    68 return 0;
    69 }


4. 程序分析:
由于不要改变原始物体重量的值,所以在排序的时候要另外再开辟一个数组存储重量.并且另外开辟ind[]存放索引记录装载的顺序.ind[]存放的是重量数组中每个元素在这组数组中大小的顺序(索引).怎样在排序时记录索引需要在练习排序的时候注意下.

5.
学习参考资料:http://blog.csdn.net/liufeng_king/article/details/8711928

时间: 2024-10-14 00:32:28

贪心算法之最优装载问题的相关文章

贪心算法之最优装载

贪心算法通过一系列的选择来得到问题的解.它所做的每一个选择都是当前状态下局部最好选择.从许多的贪心算法求解的问题可以看到可用贪心算法求解的问题一般具有两个重要的性质:贪心选择性质和最优子结构性质. 1.贪心选择性质 贪心选择性质是 指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到.与动态规划算法的不同之处是贪心算法只依赖在当前状态下做出最优选择,然后再去解做出这个选择后产生的相应的子问题.贪心算法依赖于以往做出的选择,但是绝不依赖未来做出的选择.所以贪心算法是自顶向下解决问题

贪心算法:最优装载问题

/*----------------------------------------------------- 给出n个物体,第i个物体的重量为wi. 选择尽量多的物体,使得总重量不超过C. 输入: n和C以及n个整数表示的wi. 输出: 按照输入物体的顺序输出n个用空格分隔的Y或N. Y表示该物体被选中,N表示不被选中. 最后一行输出所选中的物体的个数num和总重量w,用空格分隔. 注意:这个地方每个物体是不可再分割的整体. 思路: 先把所有物体按重量排序(从小到大排序) , 然后贪心选择重量

趣学算法2-1 最优装载问题

(1)数据结构定义          double w[N]; //一维数组存储古董的重量 (2)按重量排序          sort(w, w+n); //按古董重量升序排序 (3)按照贪心策略找最优解         首先用变量 count 记录已经装载的古董个数, tmp 代表装载到船上的古董的重量,两个变     量都初始化为 0.然后按照重量从小到大排序,依次检查每个古董, tmp 加上该古董的重量,     如果小于等于载重量 c,则令 count++:否则,退出.————————

最优装载(贪心)

描述:有一批集装箱要装上一艘载重量为C的轮船.其中集装箱i的重量为wi.最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船. 贪心算法之最优装载 给出n个物体,第i个物体的重量为wi. 选择尽量多的物体,使得总重量不超过C. 注意:这个地方每个物体是不可再分割的整体. 思路: 先把所有物体按重量排序(从小到大排序) , 然后贪心选择重量比较小的物体直到所选物体的总重量超过所允许的最大重量C .一般选择是从最小的开始,所以先要排序 第一种方法(容器) #include <i

贪心算法正确性证明(转载from刘子韬)

这里主要是介绍一种证明贪心算法是最优的一种方法:Exchange Argument (不知道应该怎么翻译到中文,交换参数?感觉听起来挺别扭的,不像是一个方法的名字~o(╯□╰)o) Exchange Argument的主要的思想也就是 先假设 存在一个最优的算法和我们的贪心算法最接近,然后通过交换两个算法里的一个步骤(或元素),得到一个新的最优的算法,同时这个算法比前一个最优算法更接近于我们的贪心算法,从而得到矛盾,原命题成立. 下面来看一个更为formal的解释: 步骤: Step0: 给出贪

从 活动选择问题 看动态规划和贪心算法的区别与联系

这篇文章主要用来记录我对<算法导论> 贪心算法一章中的“活动选择问题”的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题---粗略提下,详细请参考<算法导论> ②活动选择问题的DP(Dynamic programming)求解--DP求解问题的思路 ③活动选择问题的贪心算法求解 ④为什么这个问题可以用贪心算法求解? ⑤动态规划与贪心算法的一些区别与联系 ⑥活动选择问题的DP求解的JAVA语言实现以及时间复杂度分析 ⑦活动选择问题的Gr

算法复习笔记(分治法、动态规划、贪心算法)

分治法 动态规划 贪心算法 分治法 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的问题,这些子问题互相独立且与原问题相同(所以可以递归).递归地解这些子问题,然后将各个子问题的解合并得到原问题的解.它的一般算法设计模式如下: divide-and-conquer(P) { //|P|表示问题的规模,n0表示阈值,当规模不超过n0时,问题容易解出,不必分解 if(|P|<=n0) adhoc(P); //将P分解成子问题 divide P into smaller subinstanc

单源最短路径_贪心算法

问题描述 给定带权有向图G =(V,E),其中每条边的权是非负实数.另外,还给定V中的一个顶点,称为源.现在要计算从源到所有其它各顶点的最短路长度.这里路的长度是指路上各边权之和. 策略与数据结构 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合.一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知. 相关解释 观测域:假设起点为v点,观测域便为v点的四周,即v的所有邻接点: 点集 V:图中所有点的集合: 点集 S:已经找到最短路径的终点集合: 数组 D:存储观测域内能观测到的最

贪心算法一:最优装载问题

1.基本思想: 贪心算法是通过一系列的选择来得到问题的解,它所做的选择都是当前情况下最优的选择,即贪心算法并不考虑整体最优,而考虑的是当前情况下的局部最优,即贪心选择. 2.贪心算法的两个性质: 1)贪心选择性质:所求解的问题的整体最优解可以通过一系列局部最优的选择来,即贪心选择达到.贪心选择所依赖的是以前所做过的选择,而对以后所做的选择没有关系. 2)最优子结构性质:一个问题的最优解包含其子问题的最优解. 3.贪心算法与动态规划的区别: 动态规划是通过自底向上的方式解决子问题,贪心算法是通过自