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

引言

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

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 0for 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_preturn 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 valuedp[0] = 0for i from 1 to n:dp[i] = prices[i] // Initialize with no cutfor 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 ordersort s in ascending ordercount = 0i = 0, j = 0while i < length(g) and j < length(s):if s[j] >= g[i]:count = count + 1i = i + 1j = j + 1else:j = j + 1return count

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/58595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL,力扣题目1709,访问日期之间最大的空档期

一、力扣链接 LeetCode_1709 二、题目描述 表&#xff1a; UserVisits ------------------- | Column Name | Type | ------------------- | user_id | int | | visit_date | date | ------------------- 该表没有主键&#xff0c;它可能有重复的行 该表包含用户访问…

第七篇: BigQuery中的复杂SQL查询

BigQuery中的复杂SQL查询 背景与目标 在数据分析中&#xff0c;我们通常需要从多个数据源中获取信息&#xff0c;以便进行深入的分析。这时&#xff0c;BigQuery提供的JOIN、UNION和子查询等复杂SQL语句非常实用。本文将以Google BigQuery的公共数据集为例&#xff0c;介绍如何…

【C++】条件变量condition_variable

文章目录 1. 条件变量定义及特点2. 代码示例3. wait方法4. wait_for方法5. notify_all和notify_one6. 思考 1. 条件变量定义及特点 条件变量 用于在线程之间协调共享资源的访问。它允许一个线程等待特定条件的满足(如某个值的变化)&#xff0c;而另一个线程在条件满足时通知(或…

C++ 线程初始化编译报错

这是一个很简单的开启一个线程, 用于演示一个线程和生命周期之间的错误,但是还没有把这个错误暴露出来, 就遇见了一个编译问题. 线程中执行指定逻辑的代码 线程的执行方法, 声明写在了ThreadRun.h 实现写在 ThreadRun.cpp中. class ThreadRun { public: void func(); };void T…

SPIRE: Semantic Prompt-Driven Image Restoration 论文阅读笔记

这是一篇港科大学生在google research 实习期间发在ECCV2024的语义引导生成式修复的文章&#xff0c;港科大陈启峰也挂了名字。从首页图看效果确实很惊艳&#xff0c;尤其是第三行能用文本调控修复结果牌上的字。不过看起来更倾向于生成&#xff0c;对原图内容并不是很复原&…

Backend - Python 爬取网页数据并保存在Excel文件中

目录 一、导入依赖 二、前端爬取页面数据 1. html 中 2. js 中 三、后端获取数据&#xff0c;并存储到 Excel 文件中 1. 后端接收数据 2. 后端存储数据 &#xff08;1&#xff09;系统代码固定存储位置 &#xff08;2&#xff09;用户可选择文件对话框的存储位置 一、…

Dubbo负载均衡

负载均衡策略与配置细节 Dubbo 内置了 client-based 负载均衡机制&#xff0c;如下是当前支持的负载均衡算法&#xff0c;结合上文提到的自动服务发现机制&#xff0c;消费端会自动使用 Weighted Random LoadBalance 加权随机负载均衡策略 选址调用。 如果要调整负载均衡算法…

软件工程中的创建型设计模式:工厂方法模式与抽象工厂模式

目录 1. 工厂方法模式&#xff08;Factory Method Pattern&#xff09; 1.1 核心概念 1.2 应用场景 1.3 优点 2. 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09; 2.1 核心概念 2.2 应用场景 2.3 优点 3. 联系与区别 4. 拓展知识 5. 结语 在软件工程…

FFmpeg 4.3 音视频-多路H265监控录放C++开发十二:在屏幕上显示多路视频播放,可以有不同的分辨率,格式和帧率。

上图是在安防领域的要求&#xff0c;一般都是一个屏幕上有显示多个摄像头捕捉到的画面&#xff0c;这一节&#xff0c;我们是从文件中读取多个文件&#xff0c;显示在屏幕上。 一 改动UI文件 这里我们要添加两个label&#xff0c;为了区分我们设置一下背景色&#xff08;这个是…

java中线程与集合的面试题

在 Java 面试中&#xff0c;线程和集合相关的知识是非常常见的考察点。以下是几个典型的问题及答案&#xff1a; 线程相关面试题 什么是线程&#xff1f; 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一个进程可以有多…

前言2、VS(Visual Studio)-2022使用

早前用VS-2010编译平台&#xff0c;进行C语言编程学习。 现如今&#xff0c;为了适应未来发展趋势以及日新月异的新功能&#xff0c;就此转到VS-2022编译平台&#xff1b; 由于都是VS编译平台&#xff0c;大多数基础功能都类似&#xff0c;关于一些基础操作可参考前言1&#…

深入了解逻辑回归:机器学习中的经典算法

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Tomcat(3) Tomcat是哪种类型的服务器?

Tomcat是一个开源的Java Servlet容器&#xff0c;同时也是一个轻量级的Web服务器。它主要用于实现Java Servlet和JavaServer Pages (JSP)规范&#xff0c;使得开发者能够部署和运行Java Web应用程序。 Tomcat的主要类型 1. Servlet容器 Tomcat的核心功能之一是作为Servlet容…

软件测试基础十四(python 类与对象)

类与对象的意义 面向对象编程的基础 模拟现实世界&#xff1a;在Python中&#xff0c;类和对象是面向对象编程&#xff08;OOP&#xff09;的核心概念。类就像是制造对象的蓝图或者模板&#xff0c;它定义了对象的属性&#xff08;数据成员&#xff09;和方法&#xff08;函数…

技术总结(二十二)

一、Redis缓存更新 在更新Redis缓存时&#xff0c;通常有两种策略&#xff1a; 更新缓存&#xff08;Cache-Aside Pattern&#xff09;&#xff1a;先从缓存获取数据&#xff0c;如果缓存中没有数据或数据已经过期&#xff0c;则从数据库中获取最新数据&#xff0c;并更新到缓…

[High Speed Serial ] Xilinx

Xilinx 高速串行数据接口 收发器产品涵盖了当今高速协议的方方面面。GTH 和 GTY 收发器提供要求苛刻的光互连所需的低抖动&#xff0c;并具有世界一流的自适应均衡功能&#xff0c;具有困难的背板操作所需的 PCS 功能。 Versal™ GTY &#xff08;32.75Gb/s&#xff09;&…

基于CNN-RNN的影像报告生成

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【PaddleNLP的FAQ问答机器人】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

Java的main方法static

在Java中&#xff0c;main方法是程序的入口方法。它必须是一个静态方法&#xff0c;这意味着它可以在程序的其他部分被直接调用&#xff0c;而不需要实例化类。使用静态方法的一个好处是它们可以直接通过类名调用&#xff0c;而不需要创建对象。 以下是main方法的典型声明&…

java list使用基本操作

import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class Main {public static void main(String[] args) {ArrayList list new ArrayList();list.add("张三");list.add("李四");list.add("王五");l…

Java入门15——抽象类

今天我们来看抽象类和接口~话不多说&#xff0c;开始正题~ 在前面我们学习了继承&#xff0c;我们知道了父类是子类共有的属性&#xff0c;而且子类重写了父类的方法&#xff0c;父类里的方法就不会被具体的使用了&#xff0c;为了防止你不小心调用了父类里被子类重写方法的调用…