优化策略:揭秘钢条切割与饼干分发的算法艺术

简介: 本文探讨了钢条切割与饼干分发两个经典算法问题,展示了算法在解决实际问题中的应用。钢条切割问题通过动态规划方法,计算出不同长度钢条的最大盈利切割方式,考虑焊接成本后问题更为复杂。饼干分发问题则采用贪心算法,旨在尽可能多的喂饱孩子,分别讨论了每个孩子一块饼干和最多两块饼干的情况。这些问题不仅体现了数学的精妙,也展示了工程师的智慧与创造力。

引言

       在生活中,钢条和饼干看似风马牛不相及,但它们的分割与分发却隐藏着惊人的数学魅力。如何最大化利润?如何用有限的资源最大程度满足需求?这便是算法世界中的艺术。今天,我们来揭秘钢条切割与饼干分发的算法设计。本文不仅有趣,也能带你领略算法的美妙和工程师的智慧。

1.钢条切割

1.1题目描述

某公司的主营业务是切割整段钢条并出售,切割钢条的成本和损耗忽略不计。

该公司现有以下长度的钢条:

钢条长度/米 10 12 15
成本/百元 10 12 15

已知不同长度的钢条的出售价格:

钢条长度/米

1

2

3

4

5

6

7

8

9

10

售价/百元

1

5

8

9

10

17

17

20

24

24

  1. 假如你是该公司的工程师,试确定每条钢条的切割方式使盈利最大。
  2. 经过技术攻关,公司掌握了将钢条焊接的方法,且每次焊接所需成本为1百元,试确定钢条的焊接或/和切割方式使盈利最大。

1.2算法设计 (第一部分:不考虑焊接)

       采用动态规划法。dp[i] 表示长度为 i 米钢条的最大收益。状态转移方程:

 dp[i] = max(price[i], dp[i-j] + dp[j]) (1 ≤ j ≤ i)

       其中 price[i] 为长度为 i 米钢条的售价。

1.3伪代码实现 (第一部分:不考虑焊接)

function max_profit_no_weld(prices, n):
  dp = array of size n+1, initialized to 0
  for i from 1 to n:
    max_p = prices[i]
    for j from 1 to i:
      max_p = max(max_p, dp[i-j] + dp[j])
    dp[i] = max_p
  return dp[n]

image.gif

1.4算法设计 (第二部分:考虑焊接)

       仍然采用动态规划。dp[i] 表示长度为 i 米钢条的最大收益,考虑焊接成本。状态转移方程更加复杂,需要考虑所有可能的切割和焊接组合:

  dp[i] = max(price[i], max(dp[j] + dp[i-j] - 1, dp[j] + price[i-j] - 1, price[j] + dp[i-j] - 1)) (1 ≤ j ≤ i/2)

1.5伪代码实现 (第二部分:考虑焊接)

function max_profit_weld(prices, n):
  dp = array of size n+1, initialized to -infinity  // Initialize with a very small value
  dp[0] = 0
  for i from 1 to n:
    dp[i] = prices[i] // Initialize with no cut
    for j from 1 to i/2:
      dp[i] = max(dp[i], dp[j] + dp[i-j] - 1)
      dp[i] = max(dp[i], dp[j] + prices[i-j] - 1)
      dp[i] = max(dp[i], prices[j] + dp[i-j] - 1)
  return dp[n]

image.gif

2.饼干分发

2.1题目描述

假设你是一个幼儿园园长,现在要给孩子们分发饼干。由于饼干数量有限,每个孩子都只能得到一块饼干。其中,孩子i所需的饼干大小为gi,饼干j的大小为sj,若sj≥gi则孩子能够吃饱。你的目标是尽可能喂饱更多数量的孩子,并输出这个最大数值。

示例1:你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。虽然你有两块小饼干,但饼干的尺寸都是1只能让胃口值是1的孩子满足,所以输出1。

输入:g=[1,2,3],s=[1,1]

输出:1

示例2:你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。你拥有的饼干数量和尺寸都足以让所有孩子满足,所以输出2。

输入:g =[1,2],s=[1,2,3]

输出:2

1.现有如下饼干和孩子,试求其输出。

第一组:

g=[1 2 2 3 5 6 8 10]

s=[1 1 2 2 4 5 5 6 7 8 9 10]

第二组:

g=[12 5 8 1 5 3 7 5 8 6]

s=[15 6 8 5 2 8 7 4 5 1 2 4 3 6]

2.经过和孩子友好协商,孩子同意每个孩子可以有最多两块饼干,针对上述两组饼干和孩子试求能否喂饱更多孩子。

2.2算法设计 (第一部分:每个孩子一块饼干)

采用贪心算法。先对 g 和 s 排序,然后从最小的孩子开始,分配最小的满足条件的饼干。

2.3伪代码实现 (第一部分:每个孩子一块饼干)

function max_satisfied_children(g, s):
  sort g in ascending order
  sort s in ascending order
  count = 0
  i = 0, j = 0
  while i < length(g) and j < length(s):
    if s[j] >= g[i]:
      count = count + 1
      i = i + 1
      j = j + 1
    else:
      j = j + 1
  return count

image.gif

2.4算法设计 (第二部分:每个孩子最多两块饼干)

       仍然采用贪心算法,但需要修改分配策略。先尝试分配一块饼干,如果满足不了,再尝试分配两块。

2.5伪代码实现(第二部分:每个孩子最多两块饼干)

function max_satisfied_children_two(g, s):
  sort g in ascending order
  sort s in ascending order
  count = 0
  i = 0, j = 0
  while i < length(g) and j < length(s):
    if s[j] >= g[i]:
      count = count + 1
      i = i + 1
      j = j + 1
    else:
      k = j + 1
      if k < length(s) and s[j] + s[k] >= g[i]:
        count = count + 1
        i = i + 1
        j = k + 1
      else:
        j = j + 1
  return count

image.gif

       通过这两个问题的探讨,我们可以看到算法在解决实际问题中的强大能力。无论是在工业生产中的钢条切割问题,还是在日常生活中的饼干分发问题,算法都能提供高效且经济的解决方案。这些算法不仅体现了数学的精妙,也展示了工程师在解决实际问题时的智慧和创造力。

3.总结

       本文探讨了两个经典的算法问题:钢条切割和饼干分发,展示了算法在解决实际问题中的强大能力和数学的魅力。这两个问题虽然看似简单,却涉及到了动态规划和贪心算法等重要的算法设计思想。

       在钢条切割问题中,我们首先考虑了不考虑焊接的情况,通过动态规划的方法,计算出每种长度钢条的最大盈利切割方式。动态规划的核心在于状态转移方程的设计,它能够将问题分解为更小的子问题,并利用子问题的解来构建原问题的解。接着,我们考虑了焊接的情况,这使得问题变得更加复杂,因为我们需要考虑所有可能的切割和焊接组合。这个问题的解决同样依赖于动态规划,但状态转移方程更加复杂,需要考虑焊接成本。

       在饼干分发问题中,我们采用了贪心算法来解决。贪心算法的关键在于每一步都做出局部最优的选择,希望这样的局部最优选择能够导致全局最优解。在每个孩子一块饼干的情况下,我们通过对孩子的需求和饼干的大小进行排序,然后从最小的孩子开始分配最小的满足条件的饼干。在每个孩子最多两块饼干的情况下,我们同样采用贪心算法,但需要修改分配策略,尝试分配一块饼干,如果满足不了,再尝试分配两块。

       这两个问题的探讨不仅体现了数学的精妙,也展示了工程师在解决实际问题时的智慧和创造力。算法的应用不仅限于计算机科学领域,它们在工业生产、物流管理、资源分配等多个领域都有着广泛的应用。通过算法,我们可以更高效地利用资源,最大化利润,满足需求,这些都是算法在现代社会中不可或缺的价值。

       总的来说,钢条切割和饼干分发问题不仅是算法学习的入门课题,也是理解算法如何解决实际问题的重要案例。它们教会我们如何将复杂问题分解为可管理的小问题,并通过巧妙的算法设计找到最优解。这些算法的应用不仅提高了效率,也为我们提供了解决问题的新思路,体现了算法之美。

目录
打赏
0
4
4
0
129
分享
相关文章
基于和声搜索优化算法的机器工作调度matlab仿真,输出甘特图
本程序基于和声搜索优化算法(Harmony Search, HS),实现机器工作调度的MATLAB仿真,输出甘特图展示调度结果。算法通过模拟音乐家即兴演奏寻找最佳和声的过程,优化任务在不同机器上的执行顺序,以最小化完成时间和最大化资源利用率为目标。程序适用于MATLAB 2022A版本,运行后无水印。核心参数包括和声记忆大小(HMS)等,适应度函数用于建模优化目标。附带完整代码与运行结果展示。
基于GA遗传优化TCN-GRU时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB2022a开发,提供无水印算法运行效果预览及核心程序(含详细中文注释与操作视频)。通过结合时间卷积神经网络(TCN)和遗传算法(GA),实现复杂非线性时间序列的高精度预测。TCN利用因果卷积层与残差连接提取时间特征,GA优化超参数(如卷积核大小、层数等),显著提升模型性能。项目涵盖理论概述、程序代码及完整实现流程,适用于金融、气象、工业等领域的时间序列预测任务。
基于遗传优化算法的多AGV栅格地图路径规划matlab仿真
本程序基于遗传优化算法实现多AGV栅格地图路径规划的MATLAB仿真(测试版本:MATLAB2022A)。支持单个及多个AGV路径规划,输出路径结果与收敛曲线。核心程序代码完整,无水印。算法适用于现代工业与物流场景,通过模拟自然进化机制(选择、交叉、变异)解决复杂环境下的路径优化问题,有效提升效率并避免碰撞。适合学习研究多AGV系统路径规划技术。
基于GA遗传优化TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于遗传算法优化的时间卷积神经网络(TCN)用于时间序列预测的方法。算法运行于 Matlab2022a,完整程序无水印,附带核心代码、中文注释及操作视频。TCN通过因果卷积层与残差连接学习时间序列复杂特征,但其性能依赖超参数设置。遗传算法通过对种群迭代优化,确定最佳超参数组合,提升预测精度。此方法适用于金融、气象等领域,实现更准确可靠的未来趋势预测。
|
13天前
|
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
33 8
|
19天前
|
基于 Python 哈希表算法的员工上网管理策略研究
于当下数字化办公环境而言,员工上网管理已成为企业运营管理的关键环节。企业有必要对员工的网络访问行为予以监控,以此确保信息安全并提升工作效率。在处理员工上网管理相关数据时,适宜的数据结构与算法起着举足轻重的作用。本文将深入探究哈希表这一数据结构在员工上网管理场景中的应用,并借助 Python 代码示例展开详尽阐述。
37 3
基于BBO生物地理优化的三维路径规划算法MATLAB仿真
本程序基于BBO生物地理优化算法,实现三维空间路径规划的MATLAB仿真(测试版本:MATLAB2022A)。通过起点与终点坐标输入,算法可生成避障最优路径,并输出优化收敛曲线。BBO算法将路径视为栖息地,利用迁移和变异操作迭代寻优。适应度函数综合路径长度与障碍物距离,确保路径最短且安全。程序运行结果完整、无水印,适用于科研与教学场景。
基于NSGAII的的柔性作业调度优化算法MATLAB仿真,仿真输出甘特图
本程序基于NSGA-II算法实现柔性作业调度优化,适用于多目标优化场景(如最小化完工时间、延期、机器负载及能耗)。核心代码完成任务分配与甘特图绘制,支持MATLAB 2022A运行。算法通过初始化种群、遗传操作和选择策略迭代优化调度方案,最终输出包含完工时间、延期、机器负载和能耗等关键指标的可视化结果,为制造业生产计划提供科学依据。
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
基于GA遗传优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
本项目基于MATLAB 2022a实现了一种结合遗传算法(GA)优化的时间卷积神经网络(TCN)时间序列预测算法。通过GA全局搜索能力优化TCN超参数(如卷积核大小、层数等),显著提升模型性能,优于传统GA遗传优化TCN方法。项目提供完整代码(含详细中文注释)及操作视频,运行后无水印效果预览。 核心内容包括:1) 时间序列预测理论概述;2) TCN结构(因果卷积层与残差连接);3) GA优化流程(染色体编码、适应度评估等)。最终模型在金融、气象等领域具备广泛应用价值,可实现更精准可靠的预测结果。

热门文章

最新文章