贪心算法解决最优装载问题
贪心算法之最优装载问题
贪⼼算法之最优装载问题
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*/
7void swap(int *a,int *b)
8 {
9int temp;
10 temp = *a;
11 *a = *b;
12 *b = temp;
13 }
14// 采⽤选择法对重量进⾏排序,t中记录的是从⼩到⼤的包的索引
15void sortweight(int *w,int *t,int n)
16 {
17int i,j,temp;
18int *w1 = malloc(sizeof(int)*n);
19for(i =0; i < n; ++i)
20 {
21 t[i] = i;
22 w1[i] = w[i];
23 }
24for(i = 0; i < n; ++i)
25 {
26 temp = i;
27for(j = i+1; j < n; ++j)
贪心算法求解问题(优化版)
贪心算法求解问题
问题分析:
此问题为程序最优存储问题,问题要求最后存储的两个磁带上的长度差异就最小。若在最优解中去掉i个程序段,显然在(n-i)个程序段的存储中应仍是最优解,因为此问题存在最优子结构。
另外,由于每个程序的长度不同,每将一个程序存储到A或者B(用A和B来表示两个磁带上存储程序的集合)后,显然还与后续怎么存储程序有关,即当前结果依赖子问题的结果。这正是动态规划算法的基本特征,而贪心算法仅在当前状态下做出最好选择,然后再去做子问题的局部最优解最终就是问题的最优解,贪心算法不依赖于将来所做的子问题的解,显示,此问题是一个动态规划问题,是一个0-1背包问题。
虽然对有些问题,贪心算法并不能得到一个最优解,但往往能快速地得到一个近似最优解。下面就来讨论如何用贪心算法得到近似最优解。
贪心算法思路
为了使最后两个磁带的长度差异越小,就先将长度较大的程序优先放入到磁带(此处用A和B分别表示两个磁带)上。因此排序选择递减排序。
用p[ ]数组来存放第i个程序长度为p[i-1],首先将其按程序长度大小递减的顺序排序,将排好序的各程序下标记录到与与p[]等长的数组a[ ]中。
然后再根据a[]中记录的下标找到相应的程序p[a[i]]放到A或者B 中。
现在就接下就是如何存放来达到近似最优解的问题了
开始A和B中没有任何元素(本程序中采用vector动态定义A,B),如果用sumA和sumB来标记A和B中已存入程序的总长度,在存入当前最优解时,先比较sumA和sumB 的大小,将最优解存入到程序总长度较短的那个程序集合,如果长度一样,则存入到A或者B中(本程序是存入到A集合中),可以看到这样存入的话,就会尽量减小A和B长度的差异,从而尽量接近最优存储得到近似最优解
最优装载问题
问题描述 实现原理 贪心性质 代码实现 致谢
问题描述
有一批集装箱要装上一艘载重量为 c的轮船。 第 i个集装箱的重量为 Wi。 最优装载问题要求在装载体积不受限制的情况 下,将尽可能多的集装箱装上轮船。
问题描述
问题可形式化描述为: 设: xi表示第i个集装箱是否装载, xi = 0 or 1, i = 1 to n; 求: Max(x1+x2+…+xn) 约束条件: W1*x1 + W2*x2 + … + Wn*xn <= c
代码实现
//累加重量 计算可装载集装箱数量 maxLoad = 500; countLoad = 0; quantity = 0; for(i=0;i<8;i++){ //如果还能继续装载 if(boxes[i].weight <= maxLoad - countLoad){ countLoad = countLoad + boxes[i].weight; //计算最大装载数量quantity quantity ++; //获取装载标记 flag[boxes[i].index] = 1;}} 时间复杂度O(n)
代码实现
问题实例 假设集装箱数量n=8, 八个集装箱的重量是 [W0,W2,…,W7]= [100,200,50,90,150,50,20,80], 船只载重c=400。 求该条件下的最优装载问题。
信息学奥林匹克竞赛指导之基础算法—贪心算法
19
-贪心算法
贪心算法的经典应用-2
• 例题2:
• 【问题描述】:一条街道的一遍几座房子。因为环保原因居民想要在路边种
些树,路边的地区被分割成n块,并被编号为1,…,n,每块大小为一个单
位尺寸并最多可以种一棵树。每个居民想在门前种些树并指定了三个数b,e,
t,这三个数分别表示该居民想在b和e之间最少种t棵树,当然 ≤ , ≤ −
这类问题的一种常用算法。在众多的算法中,贪心算法可以算得
上是最接近人们日常思维的一种算法,常备信息学奥赛选手用于
求解一些数据规模很大的问题。
• 贪心算法一般将求解过程分成若干个步骤,但每个步骤都应用贪
心原则,选取当前状态下最好/最优的选择(局部最有利的选择),
并以此希望最后堆叠出的结果也是最优的解。也就是说,贪心算
• 以本题样例为例:
3
1
2
5
4
6
1
7
• 先将4个活动按结束时间ⅈ 升序排列,得到4个活动的时间区间为
(1,3),(2,5),(4,6),(1,7)。贪心选择最早结束的活动
(1,3),选择第二个活动时,找第一个起始时间 大于等于结束
15
-贪心算法
贪心算法的经典应用-1
• 时间ⅈ 的活动,即(4,6),选择此活动后,结束时间为6;再次
坐标,直到选择的区间已包含了t为止。
贪心算法求解最优解问题
贪心算法求解最优解问题
贪心算法是计算机科学领域中常用的一种算法。它常常被用来
求解最优解问题,如背包问题、最小生成树问题、最短路径问题等。贪心算法解决最优解问题的基本思路是,每一步都选取当前
状态下最优的解决方案,直到达到全局最优解。在这篇文章中,
我们将为大家深入探讨贪心算法求解最优解问题的基本思路、算
法复杂度和应用场景等方面的知识。
基本思路
贪心算法是一种基于贪心策略的算法。其核心思想是,每一步
都采用当前最优策略,以期最终达到全局最优解。在贪心算法中,每个子问题的最优解一般都是由上一个子问题的最优解推导出来的。因此,关键在于如何找到最优解。
具体而言,贪心算法一般由三部分组成,分别为:状态、选择
和判断。首先,需要明确当前问题的状态,即问题的规模和限制
条件。然后,在当前的限制条件下,我们需要从可能的方案中选
择出最优的方案,并把这个选择作为解的一部分。最后,需要判
断选择是否符合问题的限制条件,是否达到全局最优解。
算法复杂度
在进行算法分析时,我们需要考虑算法的时间复杂度和空间复杂度。对于贪心算法而言,其时间复杂度一般是 O(nlogn) 或 O(n) 级别的,其中 n 表示问题的规模。这种效率在实际应用中表现出了很高的稳定性和效率。
应用场景
贪心算法通常应用于需要求解最优解问题的场景中。例如:
- 贪心算法可以用来求解背包问题。在背包问题中,我们需要在限定的空间内选取最有价值的物品装入背包中以努力获得最大的收益。在贪心策略下,我们只需要按单位重量价值从大到小的顺序进行选择,就可以得到最优解;
- 贪心算法也可以用来求解最小生成树问题。这个问题是指,在给定一个图的时候,我们需要选出一棵生成树,使得生成树上的所有边权之和最小。在此问题中,我们可以将图上的边权按大
贪心算法通过每次选择局部最优解来达到全局最优
贪心算法通过每次选择局部最优解来达到全
局最优
贪心算法是一种常用的解决优化问题的算法。它通过每次选择局部最优解来达到全局最优的目标。在本文中,我们将介绍贪心算法的原理、应用场景以及优缺点。
一、原理
贪心算法的基本原理非常简单:每一步都选择当前状态下的局部最优解,最终得到的结果就是全局最优解。贪心算法不考虑过去的选择对未来的影响,只关注眼前的最佳选择。
二、应用场景
贪心算法在各个领域都有广泛的应用,下面我们将以几个常见的实际问题来说明。
1. 图的最小生成树问题
在一个连通无向图中,找到一个包含所有节点且权值最小的无回路子图,这个问题称为最小生成树问题。贪心算法可以通过每次选择权值最小的边来逐步构建最小生成树。
2. 分糖果问题
有一组孩子和一组糖果,每个孩子有一个需求因子和每个糖果有一个大小。当糖果的大小不小于孩子的需求因子时,孩子可以获得该糖
果。目标是尽可能多地满足孩子的需求,贪心算法可以通过给每个孩子分配满足其需求因子的最小糖果来达到最优解。
3. 区间调度问题
给定一个任务列表,每个任务有一个开始时间和结束时间。目标是安排任务的执行顺序,使得尽可能多的任务能够被完成。贪心算法可以通过选择结束时间最早的任务来实现最优解。
以上只是一些贪心算法的应用场景,实际上贪心算法可以用于解决各种优化问题。
三、优缺点
1. 优点
①简单:贪心算法的思路相对简单,容易理解和实现。
②高效:由于只考虑局部最优解,贪心算法的时间复杂度较低,通常能够在较短的时间内得到一个接近最优解的结果。
③可用于近似求解:由于贪心算法不保证得到全局最优解,但可以用于求解近似最优解的问题。
实验报告:贪心算法--最优装载
XXXX 大学计算机学院实验报告计算机学院2017级软件工程专业 5 班指导教师
学号姓名2019年10 月28 日成绩
实验内容、上机调试程序、程序运行结果
System.out.print(weight[i]+" ");
}
System.out.println();
//从控制台获取集装箱的最大重量
System.out.println("请输入集装箱的最大重量:");
Scanner s = new Scanner(System.in);
maxWeight=s.nextInt();
System.out.print("可装入的集装箱有:");
//将一批集装箱装上一艘重量为80的轮船。在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。(重量从小到大装)
for(int k=0;k<weight.length;k++){
sumWeight += weight[k];
if(sumWeight<=maxWeight){
System.out.print(weight[k]+"kg ");
}
}
}
}
②完成效果
贪心算法经典问题:活动安排,背包问题,最优装载,单源最短路径 Dijiksra,找零钱问题,多机调度
活动安排
public static int greedySelector(int [] s, int [] f, boolean a[])
{ //s[]开始时间f[]结束时间
int n=s.length-1;
a[1]=true;
int j=1;
int count=1;
for (int i=2;i<=n;i++)
{ if (s[i]>=f[j]) { a[i]=true; j=i; count++; }
else a[i]=false;
}
return count;
}
背包问题
void Knapsack(int n,float M,float v[],float w[],float x[])
{ Sort(n,v,w); //以每种物品单位重量的价值Vi/Wi从大到小排序
int i;
for (i=1;i<=n;i++) x[i]=0;
float c=M;
for (i=1;i<=n;i++)
{ if (w[i]>c) break;
x[i]=1;
c-=w[i];
}
if (i<=n) x[i]=c/w[i]; //允许放入一个物品的一部分
}
最优装载
void Loading(int x[], T ype w[], T ype c, int n)
{ int *t = new int [n+1]; //t[i]要存的是w[j]中重量从小到大的数组下标Sort(w, t, n); //按货箱重量排序
for (int i = 1; i <= n; i++) x[i] = 0; //O(n)
for (int i = 1; i <= n && w[t[i]] <= c; i++)
关于贪心算法的经典问题(算法效率or动态规划)
关于贪⼼算法的经典问题(算法效率or动态规划)
如题,贪⼼算法⾪属于提⾼算法效率的⽅法,也常与动态规划的思路相挂钩或⼀同出现。下⾯介绍⼏个经典贪⼼问题。(参考⾃刘汝佳著《算法竞赛⼊门经典》)。
P.S.下⽂皆是我⼀个字⼀个字敲出来的,绝对“童叟⽆欺”,哈哈。(。⌒∇⌒) 耗费了我的很多时间,所以——希望对⼤家有帮助啊~ (=^‸^=)⼀、背包相关问题
1.最优装载问题:给出N个物体,有⼀定重量。请选择尽量多的物体,使总重量不超过C。
解法:只关⼼数量多,便把重量从⼩到⼤排序,依次选,直到装不下。
2.部分背包问题:给出N个物体,有⼀定重量和价值。请选择⼀些物体的⼀部分使在总重量不超过C的条件下总价值最⼤。
解法:关⼼总价值⼤,物体可取部分,便优先取单位重量价值较⼤的物体。
3.乘船问题:有N个⼈,有⼀定重量。每艘船的最⼤载重量均为C,且最多载2⼈。请⽤最少的船装载所有⼈。
解法:关⼼数量少,要尽量使每艘船的实际载重量尽量接近于最⼤载重量。便把重量从⼩到⼤排序,每艘船依次先载⼀个⼈,再载重量最接近船的剩余可载重量的⼈。这样可以使眼前的消费(剩余载重量)最少。
实现:⽤2个变量 l , r 分别从两头往中间移动,l 和 r 可共乘⼀艘船,或 r ⾃⼰乘⼀艘船。
⼆、区间相关问题
1.选择不相交区间:数轴上有N个开区间(Li,Ri),请选择尽量多个区间,并保证这些区间两两没有公共点。
解法:先把这些区间按找 Ri 从⼩到⼤的顺序排序,再对按序排列的每2个区间A,B分情况讨论:(1)A被B包含,选A最优;(2)A右边的⼀部分与B左边的⼀部分相交,选A最优,因为选A⽐B减少了与后⾯区间相交的可能性;(3)A、B不相交,便2个都选。总的来说就是排序后,从左到右选第⼀个没有与前⾯已选的区间相交的区间。O(n)。
算法设计与分析-贪心算法-最优装载
计算机算法与设计
实验内容:贪心算法-最优装载
问题描述:有一批集装箱要装上一艘载重量为c 的轮船。其中集装箱i 的重量为Wi ,最优装载问题要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
问题分析:
该问题可形式化描述为:
∑=n i i
x 1
max
c x w n i i
i ≤∑=1 {}n i x i ≤≤∈1,1,0
算法描述:最优装载问题可用贪心算法求解。采用重量最轻者先装的贪心选择策略,可产生最优装载问题的最优解。具体算法描述如下:
Template<class Type>
Void Loading(int x[],Type w[],Type c ,int n)
{
int *t = new int [n+1];
Sort(w,t,n);
for(int i =1;i<+n;i++)
{
x[i] = 0;
}
for (int i = 1;i<=n&&w[t[i]]<=c;i++)
{
x[t[i]] = 1;
c-= w[t[i]];
}
}
所需计算时间为O(nlogn)
运行结果:
另选一组数据输入:
详细设计:
#include <iostream>
using namespace std;
const int N = 100;
template<class Type>
void Loading(int x[],Type w[], Type c, int n) {
int *t = new int [n+1];//
Sort(w, t, n); //调用SelectSort函数
贪心算法与最优策略
不同点:动态规划算法通常以自底向上的 方式解各子问题,而贪心算法则通常以自顶 向下的方式进行,以迭代的方式作出相继的 贪心选择,每作一次贪心选择就将所求问题 简化为规模更小的子问题。
问题1:对于具有最优子结构的问题应该 选用贪心算法还是动态规划算法求解?
问题2:是否能用动态规划算法求解的问 题也能用贪心算法求解?
Sort(w, t, n);
for (int i = 1; i <= n; i++) x[i] = 0;
for (int i = 1; i <= n && w[t[i]] <= c; i++)
{x[t[i]] = 1; c -= w[t[i]];}
}
PPT文档演模板
贪心算法与最优策略
2、贪心选择性质
PPT文档演模板
贪心算法与最优策略
2、构造哈夫曼编码
哈夫曼提出构造最优前缀码的贪心算法, 由此产生的编码方案称为哈夫曼编码。
哈夫曼算法以自底向上的方式构造表示 最优前缀码的二叉树T。
算法以|C|个叶结点开始,执行|C|-1次
的“合并”运算后产生最终所要求的树T。
PPT文档演模板
贪心算法与最优策略
3、哈夫曼算法的正确性
else A[i]=false;
•各活动的起始时间和 结束时间存储于数组s 和f中且按结束时间的
二维装箱问题的算法
二维装箱问题(2D Bin Packing Problem)是一个经典的组合优化问题,它的目标是将一系列的矩形物品放入最小数量的容器中,同时满足每个容器的尺寸限制。这个问题在实际应用中有很多场景,如物流、仓储、广告排版等。
解决二维装箱问题的算法有很多,以下是一些常见的算法:
1. 贪心算法(Greedy Algorithm):贪心算法是一种简单且易于实现的算法。它的基本思想是在每一步都选择当前最优的解决方案。对于二维装箱问题,贪心算法可以选择每次放入面积最大的矩形,直到无法再放入为止。然后开始新的一行,重复这个过程。贪心算法的缺点是可能得不到最优解,因为它没有考虑到后续的放置情况。
2. 启发式算法(Heuristic Algorithm):启发式算法是一种基于经验的算法,它通过一定的规则来指导搜索过程。对于二维装箱问题,启发式算法可以根据矩形的长宽比、面积等因素来确定放置的顺序和位置。启发式算法通常能够得到较好的解,但不一定是最优解。
3. 遗传算法(Genetic Algorithm):遗传算法是一种模拟自然选择和遗传机制的全局搜索算法。它通过不断地进行交叉、变异和选择操作,来生成新的解决方案。对于二维装箱问题,遗传算法可以用于优化矩形的放置顺序和位置,以找到更优的解。
4. 模拟退火算法(Simulated Annealing):模拟退火算法是一种基于概率的全局优化算法。它通过在一定的温度下随机搜索解空间,并在温度降低时逐渐收敛到最优解。对于二维装箱问题,模拟退火算法可以用于优化矩形的放置顺序和位置,以找到更优的解。
贪心算法在最优化问题中的应用研究
贪心算法在最优化问题中的应用研究第一章:引言
贪心算法是在最优化问题中被广泛应用的一种算法。在计算机科学领域中,贪心算法是一种启发式算法,通过在每个步骤中选择最优解决方案来达到整体最优解决方案。贪心算法的特点是该算法快速简单且易于理解。在不同的最优化问题中,贪心算法具有不同的应用方法和实现方式。本文将介绍贪心算法的基本原理和应用方法,并从实际问题出发,分析贪心算法在最优化问题中的应用实例。
第二章:贪心算法基本原理
贪心算法是一种求解最优解的启发式算法。贪心算法在每个步骤中选择当前状态下的最优解,使得整体解决方案达到最优化。贪心算法与动态规划、分支界限等算法相比较,贪心算法具有简单快速的特点。贪心算法的过程如下:
1、定义最优解。
2、根据问题定义选择一个最优解策略。
3、根据最优策略,在当前状态下选择最优的解。
4、对于已选择的最优解,在下一个状态下重复步骤3,直到达到最优解。
贪心算法的正确性需要证明,即要证明每一步选择的最优解可以达到整体最优解。
第三章:贪心算法应用方法
针对不同的最优化问题,贪心算法具有不同的应用方法。本节将从两个方面来介绍贪心算法应用的两种方法。
1、构造法
贪心算法通过构造法实现。通常情况下,构造法通过从剩余选项中选择当前状态下的最优解。
举例说明,对于背包问题,贪心算法以价值单位最高为准则优先选取物品装入背包中。在霍夫曼编码问题中,贪心算法选择以最小的频率为基准选择编码,这样可以使总编码长度最小。
2、优化法
贪心算法通过优化法实现。通常情况下,优化法通过贪心算法的思路对问题进行重构。这样,在选择最优状态时,将避免一些不必要的无效状态。
贪心算法的应用
贪心算法的应用
贪心算法是一种经典的算法思想,它在解决一些优化问题时具有很高的效率和实用性。本文将介绍贪心算法的原理和应用,并以实际场景为例,详细讲解贪心算法的实施过程。
一、贪心算法简介
贪心算法是一种基于贪心策略的算法思想,即每一步都选择当前最优解,以期望最终能够达到全局最优解。它的核心思想是通过不断地做出局部最优选择,从而达到全局最优。贪心算法通常适用于满足“最有子结构性质”的问题,即通过局部最优解来推导出全局最优解。
二、贪心算法的应用场景
贪心算法的应用非常广泛,以下将介绍几个常见的应用场景。
1. 零钱找零问题
假设我们需要找零n元,而手上只有面额为1元、2元、5元的硬币若干。为了找零的硬币数量最少,我们可以采用贪心算法的思想:每一步选择面额最大的硬币,再找零,直到找够n元为止。
2. 区间调度问题
给定一个由n个区间组成的集合,每个区间都有一个起始时间和结束时间,我们的目标是在不重叠的前提下,尽量多地选择区间。解决这个问题的贪心策略是选择结束时间最早的区间,再继续选择剩余区间中结束时间最早的区间,依次类推。
3. 最优装载问题
假设有一批货物和一个固定容积的仓库,每个货物有自己的体积和价值。我们的目标是在仓库容积有限的情况下,选择部分货物使得总价值最大化。贪心算法可以通过按单位价值排序,每次选择价值最高的货物进行装载,直到仓库容量不足为止。
三、贪心算法的实施过程
以区间调度问题为例,介绍贪心算法的实施过程。
1. 首先,将所有区间按照结束时间进行排序。
2. 初始化一个空的结果集res,将第一个区间加入res中。
贪心算法与最优策略
问题2:是否能用动态规划算法求解的问 题也能用贪心算法求解?
•9
例2 0-1背包问题:
给定n种物品和一个背包。物品i的重量是Wi, 其价值为Vi,背包的容量为C。应如何选择装入背 包的物品,使得装入背包中物品的总价值最大?
背包问题:
与0-1背包问题类似,所不同的是在选择物品i 装入背包时,可以选择物品i的一部分,而不一定 要全部装入背包,1≤i≤n。
•10
用贪心算法解背包问题的基本步骤:
首先计算每种物品单位重量的价值Vi/Wi,然后, 依贪心选择策略,将尽可能多的单位重量价值最高 的物品装入背包。若将这种物品全部装入背包后, 背包内的物品总重量未超过C,则选择单位重量价 值次高的物品并尽可能多地装入背包。依此策略一 直地进行下去,直到背包装满为止。
换句话说,问题的整体最优性依赖于 其局部子问题解的最优性。
•8
•贪心算法与动态规划算法的差异
共同点:贪心算法和动态规划算法都要求问 题具有最优子结构性质。
不同点:动态规划算法通常以自底向上的 方式解各子问题,而贪心算法则通常以自顶 向下的方式进行,以迭代的方式作出相继的 贪心选择,每作一次贪心选择就将所求问题 简化为规模更小的子问题。
对每一个字符规定一个0,1串作为其代码,并 要求任一字符的代码都不是其它字符代码的前缀 。这种编码称为前缀码。
贪心算法解决最优装载问题
//author : Kevin Black
//这个是我刚刚做好的作业,我觉得应该上传一些文档到豆丁
//老师···假如你看到我的作业跟网上的这个文章一样···你别以为我是抄的啊···
//记得看看作者的名字啊!!
贪心算法之最优装载问题
一. 实验目的
掌握贪心算法的基本思想(具体阐述)
掌握贪心算法的基本要素:贪心选择性质和最优子结构性质
二. 实验内容
贪心算法基本思想:
整体划分成部分,分而治之。每个部分中寻找最优解,然后综合所有部分最优解。这是,可能得到整体的最优解,但往往得到的是近似的最优解。
贪心算法基本要素:
1. 贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
2. 最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
最优装载问题
1. 问题描述:
有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
2. 数学描述:
三. 实验程序及运行结果
#include<iostream.h>
#include<stdlib.h>
void S &x,int &y)//交换
{
int t;
t=x;
x=y;
y=t;
}
void sort(int w[],int t[],int n)//排序,由小到大{
for(int m=0;m<n;m++) //为每个物品编序号{
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//这个是我刚刚做好的作业,我觉得应该上传一些文档到豆丁
//老师···假如你看到我的作业跟网上的这个文章一样···你别以为我是抄的啊···
//记得看看作者的名字啊!!
贪心算法之最优装载问题
一.
掌握贪心算法的基本思想(具体阐述)
掌握贪心算法的基本要素:贪心选择性质和最优子结构性质
}
四.实验分析
证明:
1.最优装在问题具有贪心选择性质:
分析:当载重量为定值c时,Wi越小时,可装载的集装箱数量n越大。问题划分为i个子问题,只要依次选择最小重量集装箱,满足小于等于c。原问题即可由i个子问题的最优解得到整体的最优解。所以,最优装在问题具有贪心选择性质。
yห้องสมุดไป่ตู้= max(x1w1+ x2w2+…+xiwi+…+ xnwn)
具体的做法:首先排序整个集装箱(依照重量从小到大的顺序),然后尽可能多地选出前i个集装箱,要求y =(x1w1 + x2w2 +…+ xiwi) <= c.
输出所选集装箱编号。
任务完成。
2.最优装载问题具有最优子结构性质:
分析:由2中的分析可以看出,一个问题的最优解包含其子问题的最优解,所以,最优装载问题具有最优子结构性质。
for(int j=0; j<n && w[t[j]]<=c ; j++)
{
x[t[j]]=1;//装入
c-=w[t[j]];
}
}
int main()
{
int n,c;
cout<<"请输入物品个数:"<<endl;
cin>>n;
cout<<"请输入最大容量:"<<endl;
cin>>c;
int *t=new int[n]; //存储物品编号
{
x[j]=0;
}
Loading(x,w,c,n,t);
cout<<"装入物品编号为:"<<endl;
for(int k=0;k<n;k++)
{
if(x[k]==1)
cout<<t[k]+1<<"";
}
//释放数组资源空间
delete []t;
delete []w;
delete []x;
return 0;
#include<stdlib.h>
void Swap(int &x,int &y)//交换
{
int t;
t=x;
x=y;
y=t;
}
void sort(int w[],int t[],int n)//排序,由小到大
{
for(int m=0;m<n;m++) //为每个物品编序号
{
t[m]=m;
}
int i,j;
int *w=new int[n]; //存储每个物品重量
for(int i=0;i<n;i++)
{
cout<<"请输入第"<<i<<"个物品重量:"<<endl;
cin>>w[i];
}
int *x=new int[n]; //物品是否装入
for(int j=0;j<n;j++) //初始化所有物品均为不装入
3.由于最优装载问题的贪心选择性质和最优子结构性质,最优装载问题符合贪心算法。
参考文献
[1]http://www.xinx.sdnu.edu.cn/sfzx/jpsykc/xlcad/xu04.html#(18)
}
}
i=lastExchangeIndex; //当不存在交换的时候,lastExchangeIndex = 0,循环结束
}
}
void Loading(int x[],int w[],int c,int n,int *t) //传址
{
sort(w,t,n);
for(int i=0;i<n;i++)x[i]=0;
int lastExchangeIndex;
i=n-1;
while(i>0)
{
lastExchangeIndex=0;
for(j=0;j<i;j++)
{
if(w[j+1]<w[j])
{
Swap(w[j+1],w[j]); //物品重量交换
lastExchangeIndex=j;
Swap(t[j],t[j+1]); //物品序号交换
二. 实验内容
贪心算法基本思想:
整体划分成部分,分而治之。每个部分中寻找最优解,然后综合所有部分最优解。这是,可能得到整体的最优解,但往往得到的是近似的最优解。
贪心算法基本要素:
1.贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
2.最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
最优装载问题
1.问题描述:
有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
2.数学描述:
三. 实验程序及运行结果
#include<iostream.h>