黄金矿工问题【动态规化】

简单渲染流水管线C++代码实现(三)---实战之《黄金矿工》 写这篇博客之前,纠正之前代码中一处写的不好的地方: Vector2.h中Rotation应写为Rotate。 下面我们进行今天的主题:黄金矿工 如何利用之前我们实现的一些东西来做黄金矿工呢? 其实不算很难,注意一下几个地方即可。 1.在没有任何操作的情况下,抓手应该是来回180°旋转,要注意到临界点时,角度反转,最好是用一个变量控制当前角度值,一个变量控制角度递增量(正负值控制旋转方向) 2.按下... 阅读详情

黄金矿工

很久很久以前,有一位国王拥有5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人人数也不同。例如有的金矿储量是500kg黄金,需要5个工人来挖掘;有的金矿储量是200kg黄金,需要3个工人来挖掘…如果参与挖矿的工人的总数是10。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半的金矿。要求用程序求出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿? 《漫画算法》

解题思路

动态规划:

对于最后的金矿,都有挖或者不挖的选项:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fTyBApBR-1614584588261)(https://secure-static.wolai.com/static/r4RfjqfoRpPSF1ZTBy2JE/image.png)]

对比两种情况的收益,最终可得到最大收益。

①400kg/5人②500kg/5人③200kg/3人④300kg/4人⑤350kg/3人

如何确定挖不挖⑤:比较a.10个人挖前4个的收益和b.7个人挖前4个的收益+⑤的收益

  • 10个人挖4座的收益

    • 10个工人在前3个金矿中做出最优选择。

    • 6(10-4=6)个工人在前3个金矿中做出最优选择。

  • 7个人挖4座

    • 7个工人在前3个金矿中做出最优选择。

    • 3(7-4=3)个工人在前3个金矿中做出最优选择

依次类推,把问题依次拆分。一直把问题简化成在0个金矿或0个工人时的最优选择,这个收益结果显然是0,也就是问题的边界 。

设金矿数量为n,工人数为w,金矿开采需要的工人数量为数组p,金矿储量为数组g,获得的收益为F(n,w)

  • 问题边界,金矿数为0或工人数为0的情况。

F ( n , w ) = 0 ( n = 0 或 w = 0 ) F(n,w) = 0 (n=0或w=0) F(n,w)=0(n=0或w=0)

  • 当所剩工人不够挖掘当前金矿时,只有一种最优子结构。

F ( n , w ) = F ( n − 1 , w ) ( n ≥ 1 , w < p [ n − 1 ] ) F(n,w) = F(n-1,w) (n≥1, w<p[n-1]) F(n,w)=F(n−1,w)(n≥1,w<p[n−1])

  • 在常规情况下,具有两种最优子结构(挖当前金矿或不挖当前金矿

F ( n , w ) = m a x ( F ( n − 1 , w ) , F ( n − 1 , w − p [ n − 1 ] + g [ n − 1 ) ] ) ( n > = 1 , p > = p [ n − 1 ] ) F(n,w)=max(F(n-1, w), F(n-1, w-p[n-1]+g[n-1)]) (n>= 1, p>=p[n-1]) F(n,w)=max(F(n−1,w),F(n−1,w−p[n−1]+g[n−1)])(n>=1,p>=p[n−1])

递归实现

/**
 * @param w 工人数量
 * @param n 金矿数量
 * @param p 金矿开采需要的工人数量
 * @param g 金矿储量
 * @return 最优
 */
 // 时间复杂度O(2^n)
public static int getBestGoldMining(int w, int n, int[] p, int[] g) {
    if (w == 0 || n == 0) {
        return 0;
    }
    if (w < p[n - 1]) {
        return getBestGoldMining(w, n - 1, p, g);
    }
    return Math.max(getBestGoldMining(w, n - 1, p, g),
            getBestGoldMining(w - p[n - 1], n - 1, p, g) + g[n - 1]);
}

二维数组实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2a9Qx9SK-1614584588264)(https://secure-static.wolai.com/static/j5BkyQ2MApYgRR82mwxKrs/image.png)]
从上图可发现在递归的时候出现了很多次的重复调用,为解决此问题我们可选择一个二维数组来记录中间数据,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q9Xz4EOP-1614584588266)(https://secure-static.wolai.com/static/r4uCiWnJUKX9RidLRQZhLd/image.png)]
使用上面的方程填满这张表就可以得出最终数据:
在这里插入图片描述

/**
 * 获得金矿最优收益
 *
 * @param w 工人数量
 * @param p 金矿开采需要的工人数量
 * @param g 金矿储量
 * @return 最大收益
 */
public static int getBestGoldMining(int w, int[] p, int[] g) {
    // 创建表格
    int[][] resultTable = new int[g.length + 1][w + 1];
    // 填充表格 i个金矿
    for (int i = 1; i <= g.length; i++) {
        // j个人
        for (int j = 1; j <= w; j++) {
            if (j < p[i - 1]) {
                resultTable[i][j] = resultTable[i - 1][j];
            } else {

                // 1、不挖当前金矿
                int v1 = resultTable[i - 1][j];

                // 2、挖当前金矿
                int v2 = resultTable[i - 1][j - p[i - 1]] + g[i - 1];

                // 3、比较两种情况的收益
                resultTable[i][j] = Math.max(v1, v2);
            }
        }
    }

    //返回最后1个格子的值
    return resultTable[g.length][w];
}

一维数组实现

在上面方法的循环中我们可以发现每次计算其实只用到了上一行的数据,因此,无论金矿有多少座,我们只保存1行的数据即可。在计算下一行时,要从右向左统计,把旧的数据一个一个替换掉。

public static int getBestGoldMiningV2(int w, int[] p, int[] g) {
    //创建当前结果
    int[] results = new int[w + 1];
    //填充一维数组
    for (int i = 1; i <= g.length; i++) {
        // 在计算下一行时,要从右向左统计
        for (int j = w; j >= 1; j--) {
            if (j >= p[i - 1]) {
                // 1、不挖当前金矿
                int v1 = results[j];
                // 2、挖当前金矿
                int v2 = results[j - p[i - 1]] + g[i - 1];
                // 3、比较两种情况的收益
                results[j] = Math.max(results[j], results[j - p[i - 1]] + g[i - 1]);
            }
        } 
    }
    //返回最后1个格子的值
    return results[w];
}

从右向左原因:在计算v2值时,要获取上一行的旧数据(比当前下标小),如果从左往右统计,当前位置左侧的数据已经全是本行的新数据,获取不到上一行的旧数据导致结果错误

Funcode平台C语言实现黄金矿工游戏项目 在黄金矿工游戏中,int用于表示分数、关卡等离散值,float精确描述钩子角度、摆动速度等连续物理量,而char可用于标识金币类型。例如:// 钩子摆动角度(浮点精度保障平滑动画)// 玩家得分(整型足够且高效)// 使用const定义常量,便于维护#define GRAVITY 9.8f // 宏定义物理参数,编译期替换提升性能数据类型的选择直接影响计算精度与内存占用,合理使用const和#define可实现配置集中管理,提升代码可读性与可维护性。 阅读详情

相关推荐

Unity3D黄金矿工游戏开发教程与资源包

Unity3D作为全球领先的游戏开发引擎,它被广泛应用于3D和2D游戏的创作中。它提供了全面的工具集,使开发者能够创建丰富的游戏场景和动画效果,同时支持跨平台发布,极大地拓宽了游戏的分发渠道。它的核心是所见即所得的编辑器环境,游戏开发者可以在该环境中实现从概念设计到最终产品的全过程。在这一章节中,我们将首先介绍Unity3D的历史和发展,然后探讨它的主要功能和特点。我们会深入解析Unity3D的架构,并且举例说明如何使用Unity3D快速搭建一个基础的游戏项目。

weixin_30218749的博客 1005

面试题之 【挖金矿问题】

1 题目 有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿? 2 思路 此问题是一道经典的动态规划(Dynamic programming)问题,简称DP问题,动态规划问题求解的三要素有一下三点: 全局最优解 最优子结构 问题的边界 对该金矿问题(假设共有n个金矿,共有w个工人,金矿的含金量数组为g,每个金矿所需开采工人的数组为

麦田里的守望者 1831

一文介绍Linux EAS

EAS只在系统负载不重时,即系统中每个CPU的利用率都低于其算力的80%时才被启用,而且选出的最节能CPU只有比线程当前运行的CPU节约能量大于6%时,线程才会迁移到该CPU运行。因此EAS为线程选择最节约能量的CPU来运行的前提条件是很苛刻的,针对重载场景(比如游戏),EAS的功能应该很少被使用起来,针对重载场景的功耗优化,这里可能是一个值得尝试的点。算力(capacity)是CPU调度中的一个基础概念,它反映的是一个CPU的计算能力,是个规格化的值,可以通过读取Android手机的文件节点。

youzhangjing_的博客 1234

黄金矿工

你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。 为了使收益最大化,矿工需要按以下规则来开采黄金: 每当矿工进入一个单元,就会收集该单元格中的所有黄金。 矿工每次可以从当前位置向上下左右四个方向走。 每个单元格只能被开采(进入)一次。 不得开采(...

weixin_41791402的博客 872

Qwen2.5-7B大模型实战:从零部署到高效推理全流程解析

本文详细解析了Qwen2.5-7B大模型从零部署到高效推理的全流程。内容涵盖环境准备、模型下载、使用Transformers进行核心对话推理,并深入介绍了vLLM与TGI生产级服务部署、GPTQ/AWQ量化技术以降低显存消耗,以及llama.cpp、Ollama等本地推理方案。旨在帮助开发者快速掌握部署技巧,实现大模型在消费级硬件上的高效运行。

weixin_29061425的博客 490

【STM32F042】使用NTC热敏电阻实现温度测量

1.NTC介绍 NTC是负温度系数的简写,全称是Negative temperature coefficient.意思是随着温度的升高,电阻值呈现下降趋势。常用作温度传感器。这里有一个式子表示负温度系数的电阻值: RT=R0*exp(B (1/T-1/T0)) RT为周围温度为T (K) 时的电阻值,R0是周围温度为T0(K) 时的电阻值,注意这里的温度是开...

BadBoyHolly的博客 3万+

黄金矿工游戏总结

     经过近二十天的努力,黄金矿工游戏初见雏型,它是我们对线程理解的应用,游戏的仿照版本就是网页版的黄金矿工小游戏。刚开始做这个小游戏的时候,感觉自己无从下手,毫无头绪。     这个游戏的准备工作就是P图,将游戏所需要的图片准备好,例如各种大小的金矿,石头,钩子,钱袋……真心觉得扣图是一件挺花时间的东西,如果自己熟练掌握了,那就挺简单的。我想要想做好一个游戏,各方面的东西技术还是要掌握一些...

longfengting的博客 3088

icem二维非结构网格划分_ICEM CFD网格装配

正文共:718字7图 预计阅读时间:2分钟1 前言 对于一些大型的复杂的网格划分,可以将整个模型切分成多个子模型(二维几何用线切分,三维模型用面切分),然后对各个模型单独划分网格,最终装配在一起。这和机械设计的零件设计和装配设计有点相似,这个功...

weixin_39908758的博客 1625

动态规划:国王与金矿

题目来源 题目描述 题目解析 bok 递归 public static int climbStairs(int n) { if (n < 1){ return 0; } if (n == 1){ return 1; } if (n == 2){ ...

OceanStar的博客 2998

Ubuntu22.04系统安装及配置

下载Ubuntu22.04系统镜像(下载地址:链接:https://caiyun.139.com/m/i?提取码:fLRJ),结合rufus和系统镜像制作USB启动盘,在物理机服务器上通过USB启动盘进行安装;或通过Esxi虚拟化平台创建虚拟机,然后在虚拟机中使用系统镜像进行安装。

cheagoun的博客 8万+

OData 请求里的 Nextlink 实战:在 ABAP Client Proxy 中优雅处理长列表分页

本文介绍了OData v4标准中的@odata.nextLink分页机制及其在SAP ABAP中的实践应用。重点解析了该机制通过服务端提供的完整URL实现分页获取,客户端只需循环处理直到该字段消失的特点。文章提供了清晰的ABAP代码模板,展示如何通过Remote Client Proxy实现分页数据获取,并强调了仅支持OData v4和远程消费的限制条件。通过HR员工数据聚合的实际案例,说明了流式分页处理的最佳实践,包括服务端过滤、稳定排序和内存控制等关键技术要点,为ABAP开发者提供了可直接落地的解决方案

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 271

国王和金矿问题

0-1背包问题 国王和金矿问题 描述:有一个国家发现了max_n座金矿,参与挖矿工人的总数是max_people人。每座金矿的黄金储量不同为一维数组gold[],需要参与挖掘的工人数也不同为一维数组peopleNeed[]。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要想得到尽可能多的黄金,应该选择挖取哪几座金矿? 功能: (1) 要求max_n、max_people、gold和ppeopleNeed均为可输入的; (2) 编写DP函数,求解答案F; (3) 编写main主函数,完成输入,调用D

XuJiaLiang的博客 853

【异常】Hermes Agent调用z.ai接口失败(余额不足)API call failed (attempt 1/3): RateLimitError [HTTP 429]

补充说明:同步尝试解析接口对应网页时,出现“网页解析失败,可能是不支持的网页类型,请检查网页或稍后重试”提示,该提示不影响核心报错排查,仅作为辅助信息。

奶爸的编程之路,也就一周冷个三天 1194

动态规划-黄金矿工

动态规划是一个经典的问题,在算法实现时经常需要会用到这个思想,黄金矿工是动态规划的景点问题,下面就详细讨论这个问题,如下图所示: 矿产编号 钻石储量 所需工人数量 1 400 5 2 500 5 3 200 3 4 300 4 5 350 3 我们计算在有m人时,能挖掘的最大价值的黄金,最后得到下表 矿产编号n m=1 人 m=2 人 m=3 人 m=4 人 m=5 人 m=6 人 m=7 人 m=8 人 m=9 人 m=10 人 矿产1 0 0 0 0

xqnyyy的专栏 517

从入门到精通!Arduino 全栈开发深度指南

本文围绕 Arduino 开发撰写全攻略,从基础入门到高级应用层层递进。开篇介绍 Arduino 概念、优势及硬件家族,引导读者完成开发环境搭建与首个 LED 闪烁项目;深入讲解编程语法、I/O 控制及通信协议;详细阐述传感器、模块应用与调试优化技巧;最后以自定义库开发、低功耗设计等高级内容收尾,并给出综合项目案例与产品化思路。无论新手入门,还是开发者进阶,均可从中系统学习 Arduino 知识,掌握从理论到实践的全流程开发技能。

邓邓子的博客 2755

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

unity黄金矿工游戏

unity黄金矿工游戏 游戏详情请看如下动态图: 点我下载资源

weixin_43474701的博客 1841

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

黄金矿工(dp)

题目描述 黄金矿工是一款有趣的挖矿游戏。 金矿可以看作一个二维平面(横剖图)。玩家站在原点(0,0),向下发送绳索,进行挖矿。 在金矿中,除了不同的金子价值不同,还有诸如骷髅之类的物品。玩家需要在限定时间内进行挖矿,最大化自己的收益。 所有物品的都在x轴以下,对一个在(x,y)的物品来说,我们需要花x2+y2的时间。并且如果对于两个物品,它们的位置分别为(x1,y1)和(x2,y2),并且满足y1...

eazo的博客 1684

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

黄金矿工的实现

黄金矿工 实现黄金矿工游戏大体可以分为4个类 1.背景类 package com.zhou.GUI; import java.awt.*; /** * @author:Zhou_jx, */ public class Bg { //关卡数 static int level = 1; //目标得分 int goal = level*15; //总分 static int countsum = 0; //药水数量 static int wa

TheFlangeUndead的博客 2420

用Java写一个黄金矿工游戏

roundLabel = new Label("第 " + round + " 轮");goldLabel.setText("当前金块数量:" + currentGold);roundLabel.setText("第 " + round + " 轮");goldLabel = new Label("当前金块数量:0");scoreLabel.setText("得分:" + score);scoreLabel = new Label("得分:0");// 更新进度条动画。

2401_82778412的博客 615

【回溯】黄金矿工,你小时候玩过吗?!!

​ 这道题其实也不难,就是一个深度优先遍历,不过题目说明矿工可以从网格中任意一个有黄金的单元格出发或者是停止,所以我们需要遍历每个节点作为入口的情况,所以就需要在 getMaximumGold()来记录当前已经开采的黄金数量,如果弄成全局变量也是可以的,只不过需要在回溯处理的时候多处理一下就行,不过这里作为函数参数传递的话就少个这个回溯处理了!如果该单元格是空的,那么就是。此外因为我们需要判断当前位置是否越界,所以需要有当前位置在网格中的坐标,所以需要 x。就是存放结果集的,表示当前开采的最大黄金数量!

lirendada的博客 658

unity生成预制体_unity制作童年回忆黄金矿工

小编小时候挺喜欢玩《黄金矿工》现在想来都是满满的回忆,所以今天小编心血来潮便有了这篇文章啦模仿绳子黄金矿工游戏中,玩家通过按键操作并发射钩子来挖取金矿,钩子与绞盘之间有一条绳子进行衔接,这条绳子我们运用Unity提供的LineRenderer组件来进行完成。因为材料的约束,我们运用钩子的这张图片做为玩家的本体,并在上面增加LineRenderer组件,然后在Materials选项中挑选默许的精灵图...

weixin_39871562的博客 683

[TJOI2013]黄金矿工

题目描述 小A最近迷上了在上课时玩《黄金矿工》这款游戏。为了避免被老师发现,他必须小心翼翼,因此他总是输。在输掉自己所有的金币后,他向你求助。每个黄金可以看做一个点(没有体积)。现在给出你N个黄金的坐标,挖到它们所需要的时间以及它们的价值。有些黄金在同一条直线上,这时候你必须按顺序挖。你可以瞬间把钩子转到任意角度。请你帮助小A算出在时间T内他最多可以得到多少价值的金子。 输入输出格式 输入格...

zsyzClb的博客 776

半天重现经典:Unity复刻黄金矿工

本文介绍了使用Unity引擎复刻经典游戏《黄金矿工》的核心实现过程。重点讲解了钩子摆动、发射回收、物品抓取等关键功能的代码实现:通过LineRenderer组件实现绳索效果,使用RotateAround函数控制钩子摆动范围,利用碰撞检测实现物品抓取机制,并设计了随机物品生成系统。项目保留了原版游戏的简单乐趣,同时展示了游戏基础物理和碰撞系统的实现原理,适合游戏开发新手学习2D游戏制作基础。

YF云飞的博客 1081

递归算法学习——黄金矿工,不同路径III

递归算法学习——黄金矿工,不同路径III

qq_41934502的博客 1715

1219.黄金矿工

题目 1219.黄金矿工 题目大意 你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。 为了使收益最大化,矿工需要按以下规则来开采黄金: 每当矿工进入一个单元,就会收集该单元格中的所有黄金。 矿工每次可以从当前位置向上下左右四个方向走。 每个单元格只能被开采(进入)一次。 不得开采(进入)黄金数目为 0 的单元格。 矿工可以从网格中 任意一个 有黄金的单元格出

Phoenix_ZengHao的博客 295

leetcode 1219. 黄金矿工

leetcode 1219. 黄金矿工 文章目录leetcode 1219. 黄金矿工一、题目1.题目描述2.基础框架3.解题思路4.知识点 一、题目 原题链接:1219. 黄金矿工 1.题目描述 你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。 为了使收益最大化,矿工需要按以下规则来开采黄金: 每当矿工进入一个单元,就会收集该单元格中的所有黄金。 矿工

进击的code儿 670
上一篇: 链表中的环
下一篇: jvm运行时数据区域
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值