最优装载问题(贪心)
一、实验内容
运用贪心算法解决活动安排问题(或最优装载问题)
使用贪心算法解决最优装载问题。
二、所用算法基本思想及复杂度分析
1.算法基本思想
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。用局部解构造全局解,即从问题的某一个初始解逐步逼近给定的目标,以尽可能快的求得更好的解。当某个算法中的某一步不能再继续前进时,算法停止。
2.问题分析及算法设计
问题分析:
(1) 给定n个古董,要把它们装到装载量为c的装载船上。
(2) 首先需要对这n个古董进行质量从小到大的排序。
(3) 然后每次都选择最轻的,接着再从剩下的n-1件物品中选择最轻的。
(4) 重复第(3)步骤,直到当前载重量大于装载船的最大装载量,停止装载。
(5) 此时得到最优的贪心方案,记录下装载的最大古董数。
算法设计:
(1)算法策略:把n件物品从小到大排序,然后根据贪心策略尽可能多的选出前i个物品,直到不能装为止。
(2)特例:
- 算法复杂度分析
由最优装载问题的贪心选择性质和最优子结构性质,可知将这些古董按照其重量从小到大排序,所以算法所需的计算时间为O(nlogn)。
三、源程序核心代码及注释(截图)
四、运行结果
五、调试和运行程序过程中产生的问题及解决方法,实验总结(5行以上)
这里的调试,没有什么大问题,单纯的依次比较,判断,从而得到结果。这次实验让我对贪心算法有了更深刻的认识,其主要是从问题的初始解出发,按照当前最佳的选择,把问题归纳为更小的相似的子问题,并使子问题最优,再由子问题来推导出全局最优解。贪心算法虽然求的是局部最优解,但往往许多问题的整体最优解都是通过一系列的局部最优解的选择来达到的,所以贪心算法不一定可以得到能推导出问题的最优解,但其解法是最优解的近似解。懂得算法的原理,还需要多去练习才能更好的掌握其用法。
源码:
#include<iostream>
#include<algorithm>
#define MAXN 1000005
using namespace std;
int w[MAXN];//每件古董的重量
int main()
{
int c,n;//c:载重量,n古董数
int sum = 0;//装入古董的数量
int tmp = 0;//装入古董的重量
cin >> c >> n;
for(int i= 1; i <= n; ++i)
cin >> w[i];
sort(w+1,w+1+n);
for(int i = 1; i <= n; ++i)
{
tmp += w[i];
if(tmp <= c)
++sum;
else
break;
}
cout << sum << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)