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

news/2024/11/8 14:33:42 标签: 算法, 动态规划, 数据结构

引言

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

1.钢条切割
1.1题目描述

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

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

钢条长度/米101215
成本/百元101215

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

钢条长度/米

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]


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]

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

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

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


http://www.niftyadmin.cn/n/5744029.html

相关文章

6-1.Java 面向对象 - 初级(对象与属性、对象与方法、递归、重载、可变参数、作用域、构造器、对象创建流程详解、this 关键字)

一、对象与属性 1、基本介绍 属性是类的一个组成部分&#xff0c;一般是基本数据类型&#xff0c;也可以是引用数据类型 属性的定义语法类似变量 【访问修饰符】 【属性类型】 【属性名】;属性的定义类型可以为任何类型&#xff08;基本数据类型、引用数据类型&#xff09;…

生产环境中添加多项式特征实现:将逻辑回归应用于非线性关系

要将逻辑回归应用于非线性关系&#xff0c;并实现到生产环境中&#xff0c;我们可以通过以下步骤来完成。这里主要使用 Python 和 Scikit-Learn 库&#xff0c;因为它们为机器学习任务提供了强大的工具和易于使用的接口。我们将通过添加多项式特征来扩展逻辑回归模型&#xff0…

免费数据集网站

1、DataSearch https://datasetsearch.research.google.comhttp://DataSearch 2、FindData findata-科学数据搜索引擎https://www.findata.cn/ 3、Kaggle Kaggle: Your Machine Learning and Data Science CommunityKaggle is the world’s largest data science community …

16通道AD采集方案,基于复旦微ARM + FPGA国产SoC处理器平台

测试数据汇总 表 1 本文带来的是基于复旦微FMQL20S400M四核ARM Cortex-A7(PS端) + FPGA可编程逻辑资源(PL端)异构多核SoC处理器设计的全国产工业评估板的AD采集案例。本次案例演示的开发环境如下: Windows开发环境:Windows 7 64bit、Windows 10 64bit PL端开发环境:P…

react搭建router,redux教程

react项目搭建create-router-dom&#xff0c;redux详细解说 1.搭建react脚手架 首先选择脚手架&#xff0c;dav-cli&#xff0c;create-react-app&#xff0c;Ant-Design-Pro-cli。脚手架即为代码层次。这里我们选用create-react-app脚手架 打开我们的cmd&#xff0c;windowR输…

第一章 Linux安装 -- 安装Debian 12操作系统(四)

文章目录 2.3.4 安装Debian 12操作系统 2.3.4 安装Debian 12操作系统 虚拟机的创建参照前面2.3.1.3节里的步骤创建&#xff0c;这里不再详述。 下面就开始安装Debian 12系统了&#xff0c;单击“开启此虚拟机”&#xff0c;如图1-161虚拟机主界面。 图1-161 虚拟机主界面 弹…

传输协议设计与牧村摆动(Makimoto‘s Wave)

有一条活鱼和一条死鱼&#xff0c;你准备怎么做&#xff0c;你会将活鱼红烧或将死鱼清蒸吗&#xff1f;好的食材只需要最简单的烹饪&#xff0c;不好的食材才需要花活儿。 我此前的文字几乎都在阐述一个观点&#xff0c;广域网就是那条死鱼&#xff0c;数据中心则是那条活鱼。…

应用插件化及其进程关系梳理

插件应用的AndroidManifest.xml <manifest xmlns:android"http://schemas.android.com/apk/res/android"coreApp"true"package"com.demo.phone"android:sharedUserId"android.uid.phone"><uses-sdk android:minSdkVersion&q…