面試中算法(金礦)

有一位國王擁有5座金礦,每座金礦的黃金儲量不同,需要參與挖掘的工人人數也不同。

例如,有的金礦儲量是5ookg黃金,需要5個工人來挖掘;有的金礦儲量是2ookg黃金,需要3個工人來挖掘...... 如果參與挖礦的工人的總數是10。每座金礦要么全挖,要么不挖,不能派出一半人挖取一半的金礦。要求用程序要想得到盡可能多的黃金,應該選擇挖取哪幾座金礦?

金礦按照性價比從高到低進行排序,排名結果如下:

第1名,350kg黃金/3人的金礦,人均產量約為116.6kg黃金。

第2名,500kg黃金/5人的金礦,人均產量為100kg黃金。

第3名,400kg黃金/5人的金礦,人均產量為80kg黃金。

第4名,300kg黃金/4人的金礦,人均產量為75kg黃金。

第5名,200kg黃金/3人的金礦,人均產量約為66.6kg黃金。

由于工人數量是10人,優先挖掘性價比排名為第1名和第2名的金礦之后,工人還剩下2人,不夠再挖掘其他金礦了。

得出的最佳金礦收益是350+500即850kg黃金。
解決思路是使用貪心算法。這種思路在局部情況下是最優解,但是在整體上卻未必是最優的。

? ? 如果我放棄性價比最高的350kg黃金/3人的金礦,選擇500kg黃 金/5人和400kg黃金/5人的金礦,加起來收益是900kg黃金,是不是大于你得到的850kg黃金?

動態規劃,就是把復雜的問題簡化成規模較小的子問題,再從簡單的子問題自底向上一步一步遞推,最終得到復雜問題的最優解。?

10個工人在前4個金礦的收益,和7個工人在前4個金礦的收益+最后一個金礦的收益誰大誰小了。

?首先針對10個工人4個金礦這個子結構,第4個金礦(300kg黃金/4人)可以選擇挖與不挖。根據第4個金礦的選擇,問題又簡化成了兩種更小的子結構:

1、10個工人在前3個金礦中做出最優選擇。

2、(10-4=6)6個工人在前3個金礦中做出最優選擇。

相應地,對于7個工人4個金礦這個子結構,第4個金礦同樣可以選擇挖與不挖。根據第4個金礦的選擇,問題也簡化成了兩種更小的子結構:

1、7個工人在前3個金礦中做出最優選擇。

2、(7-4=3)3個工人在前3個金礦中做出最優選擇。

就這樣,問題一分為二,二分為四,一直把問題簡化成在0個金礦或0個工人時的最優選擇,這個收益結果顯然是0,也就是問題的邊界。
這就是動態規劃的要點:確定全局最優解和最優子結構之間的關系,以及問題的邊界。

這個關系用數學公式來表達,叫作狀態轉移方程式。

金礦數量設為n,工人數量設為w,金礦的含金量設為數組g[],金礦所需開采人數設為數組p[],設F (n,w)為n個金礦、w個工人時的最優收益函數,那么狀態轉移方程式如下:

F(n,w) =0 (n=0或w=0)? ? ?問題邊界,金礦數為0或工人數為0的情況。

F(n,w)=F(n-1,w)(n≥1,w<p[n-1])? ? 當所剩工人不夠挖掘當前金礦時,只有一種最優子結構。

F(n,w)= max(F(n-1,w),F(n-1,w-p[n-1])+g[n-1])(n≥1,wzp[n-1])? ? 在常規情況下,具有兩種最優子結構(挖當前金礦或不挖當前金礦)。?

?

在上圖中,標為橘色的方法調用是重復的。可以看到F (2,7) 、F(1,7)、F (1,2)這幾個入參相同的方法都被調用了兩次。

當金礦數量為5時,重復調用的問題還不太明顯。金礦數量越多,遞歸層次越深,重復調用也就越多,這些無謂的調用必然會降低程序的性能。?

動態規劃的另一個核心要點:自底向上求解。

此時,最后1行最后1個格子所填的900就是最終要求的結果,即5個金礦、10個工人的最優收益是9ookg黃金。?

使用二維數組來代表表格

def get_best_gold(worker,person=[],gold=[]):''':param worker:  工人數量:param person:  金礦開采人數:param gold:  金礦存儲量:return:  最優收益'''#初始化表格0r_table=[[0 for i in range(worker+1)] for j in range(len(gold)+1)]double_for(r_table)print('&'*50)#填充表格數據for i in range(1,len(gold)+1):for j in range(1,worker+1):if j<person[i-1]:r_table[i][j]=r_table[i-1][j]else:r_table[i][j] =max(r_table[i - 1][j],r_table[i - 1][j-person[i-1]]+gold[i-1])double_for(r_table)#返回最后一個格子的數據return r_table[len(gold)][worker]def double_for(ll):for row in ll:print(row)if __name__ == '__main__':#采礦人數person=[5,5,3,4,3]#采礦黃金量gold=[400,500,200,300,350]print(get_best_gold(10, person, gold))

? ? ? 程序利用雙循環來填充一個二維數組,所以時間復雜度和空間復雜度都是O ( nw) ,比遞歸的性能好多啦!?

def get_best_gold2(worker,person=[],gold=[]):'''優化:param worker:  工人數量:param person:  金礦開采人數:param gold:  金礦存儲量:return:  最優收益'''#初始化表格0results=[0]*(worker+1)print(results)#填充一維數據for i in range(1,len(gold)+1):for j in range(worker,0,-1):if j>=person[i-1]:results[j] =max(results[j],results[j-person[i-1]]+gold[i-1])print(results)#返回最后一個格子的數據return results[worker]if __name__ == '__main__':#采礦人數person=[5,5,3,4,3]#采礦黃金量gold=[400,500,200,300,350]print(get_best_gold2(10, person, gold))

空間復雜度降低到了O (n)。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11132.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11132.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11132.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Oracle impdp導入dmp文件(windows)】

Oracle impdp導入dmp文件&#xff08;windows&#xff09; 1、連接數據庫2、創建與導出的模式相同名稱的用戶WIRELESS2&#xff0c;并賦予權限3、創建directory 的物理目錄f:\radio\dmp&#xff0c;并把.dmp文件放進去4、連接新用戶WIRELESS25、創建表空間的物理目錄F:\radio\t…

試衣不再有界:Tunnel Try-on開啟視頻試衣應用新紀元

論文&#xff1a;https://arxiv.org/pdf/2404.17571 主頁&#xff1a;https://mengtingchen.github.io/tunnel-try-on-page/ 一、摘要總結 隨著虛擬試衣技術的發展&#xff0c;消費者和時尚行業對于能夠在視頻中實現高質量虛擬試衣的需求日益增長。這項技術允許用戶在不實際穿…

目標檢測——印度車輛數據集

引言 親愛的讀者們&#xff0c;您是否在尋找某個特定的數據集&#xff0c;用于研究或項目實踐&#xff1f;歡迎您在評論區留言&#xff0c;或者通過公眾號私信告訴我&#xff0c;您想要的數據集的類型主題。小編會竭盡全力為您尋找&#xff0c;并在找到后第一時間與您分享。 …

弱監督語義分割學習筆記

目錄 partial cross entropy loss GitHub - LiheYoung/UniMatch: [CVPR 2023] Revisiting Weak-to-Strong Consistency in Semi-Supervised Semantic Segmentation partial cross entropy loss import torch import torch.nn.functional as Fdef partial_cross_entropy_loss…

區塊鏈中的APP與傳統APP的區別

一、技術 區塊鏈中的APP是基于區塊鏈技術開發的&#xff0c;而傳統APP則基于傳統的應用程序商店或網頁。區塊鏈中的APP利用區塊鏈技術的去中心化、數據不可篡改等特點&#xff0c;使得應用程序的開發和分發更加安全、透明和可信。與傳統APP相比&#xff0c;區塊鏈中的APP無需中…

如何實現嵌套路由

實現步驟 1. 新建子頁面 2. 在router/index.js中的父路由節點添加children數組 3. 在children中添加子路由 {path: /,name: home,component: HomeView,children: [ {path: /pageA,name: pageA,component: pageA},{path: /pageB,name: pageB,component: pageB}] }, 5.在父路…

Web安全:SQL注入之布爾盲注原理+步驟+實戰操作

「作者簡介」&#xff1a;2022年北京冬奧會網絡安全中國代表隊&#xff0c;CSDN Top100&#xff0c;就職奇安信多年&#xff0c;以實戰工作為基礎對安全知識體系進行總結與歸納&#xff0c;著作適用于快速入門的 《網絡安全自學教程》&#xff0c;內容涵蓋系統安全、信息收集等…

前端VUE基礎之創建腳手架

創建腳手架 第一步&#xff08;僅第一次執行&#xff09;&#xff1a;全局安裝vue/cli。 npm install -g vue/cli 到你要創建項目的目錄&#xff0c;然后使用命令創建項目 vue create xxxx 第三步&#xff1a;啟動項目 npm run serv 備注&#xff1a; 1. 如出現下載緩慢請…

PHP流程控制

PHP 流程控制主要是 if 和 switch 流程控制。 當您編寫代碼時&#xff0c;您常常需要為不同的判斷執行不同的動作。您可以在代碼中使用條件語句來完成此任務。 在 PHP 中&#xff0c;提供了下列條件語句&#xff1a; if 語句 - 在條件成立時執行代碼if...else 語句 - 在條件…

訪客管理系統對于校園安全的重要性

校園訪客辦理計劃是針對校園安全需求規劃的安全辦理體系&#xff0c;主要用于對校園外來人員的科學辦理。要做好校園安全作業&#xff0c;把風險分子拒之門外尤為要害。校園訪客辦理計劃實現訪客實名制&#xff0c;并結合公安網、黑名單功用&#xff0c;對風險人員進行提前預警…

沒有公網ip,如何實現外網訪問內網?

目前撥號上網是最廣泛的上網方式&#xff0c;這種方式優點是價格便宜&#xff0c;缺點是沒有固定公網ip&#xff0c;每次重新您撥號ip地址都會變。如果有一臺服務器&#xff0c;需要實現外網訪問&#xff0c;在沒有固定公網ip的環境下&#xff0c;該如何實現呢&#xff1f;使用…

【CTF Web】QSNCTF 文章管理系統 Writeup(SQL注入+Linux命令+RCE)

文章管理系統 題目描述 這是我們的文章管理系統&#xff0c;快來看看有什么漏洞可以拿到FLAG吧&#xff1f;注意&#xff1a;可能有個假FLAG哦 解法 SQL 注入。 ?id1 or 11 --取得假 flag。 爆庫名。 ?id1 union select 1,group_concat(schema_name) from information_sch…

華為OD機試【統一限載貨物數最小值】(java)(200分)

1、題目描述 火車站附近的貨物中轉站負責將到站貨物運往倉庫&#xff0c;小明在中轉站負責調度 2K 輛中轉車(K輛干貨中轉車&#xff0c;K 輛濕貨中轉車)貨物由不同供貨商從各地發來&#xff0c;各地的貨物是依次進站&#xff0c;然后小明按照卸貨順序依次裝貨到中轉車&#xf…

二維數組 和 變長數組

在上一期的內容中&#xff0c;為諸君講解到了一維數組&#xff0c;在一維數組的基礎上&#xff0c;C語言中還有著多維數組&#xff0c;其中&#xff0c;比較典型且運用較為廣泛的就是我們今天的主角——二維數組 一 . 二維數組的概念 我們把單個或者多個元素組成的數組定義為一…

VScode 修改 Markdown Preview Enhanced 主題與字體

VScode 修改 Markdown Preview Enhanced 主題與字體 1. 修改前后效果對比2. 修改主題2.1 更改默認主題2.2 修改背景色 3. 修改字體 VS Code基礎入門使用可查看&#xff1a; VS Code 基礎入門使用&#xff08;配置&#xff09;教程 其他Vs Code 配置可關注查看&#xff1a; Vs C…

2024年如何選什么版本FL Studio才適合自己編曲?

fl studio是什么軟件 水果編曲軟件 FL Studio&#xff0c;全稱為Fruity Loops Studio&#xff0c;是一款全能音樂制作環境或數字音頻工作站&#xff08;DAW&#xff09;&#xff0c;集編曲、錄音、剪輯、混音等多種功能于一身。 FL Studio最初名為Fruity Loops&#xff0c;因…

外網如何訪問內網?快解析

由于公網IP資源短缺&#xff0c;我們的電腦大多處于內網環境&#xff0c;如何在外網訪問內網電腦&#xff0c;成為一個令人頭疼的問題&#xff0c;下面我給大家推薦一個非常實用的方法。 1&#xff1a;訪問快解析下載安裝快解析服務器 2&#xff1a;運行軟件&#xff0c;點擊“…

2.4 輸入和顯示

本節必須掌握的知識點&#xff1a; 示例五源代碼 代碼分析 匯編解析 2.4.1 示例五 ■格式化輸入函數scanf scanf函數可以從鍵盤讀取輸入的信息。scanf函數同樣可以像printf函數那樣&#xff0c;通過轉換說明“%d”來限制函數只能讀取十進制數。scanf函數的參數為可變參數…

【算法訓練 day25 修剪二叉搜索樹、將有序數組轉化為二叉搜索樹、把二叉樹搜索轉化為累加樹】

目錄 一、修剪二叉搜索樹-LeetCode 669思路實現代碼個人代碼視頻鏈接代碼 個人問題 二、將有序數組轉化為二叉搜索樹-LeetCode 108思路實現代碼個人問題 三.把二叉樹搜索轉化為累加樹-LeeCode 538思路實現代碼個人問題 一、修剪二叉搜索樹-LeetCode 669 Leecode鏈接: leetcode…

項目管理-計算題公式【復習】2/2

2.【成本】相關公式 2.1掙值分析 三個參數 &#xff08;1&#xff09;計劃價值(PV&#xff0c;Plan Value): PV&#xff1a;計劃工作分配的經批準的預算&#xff0c;是為完成某活動或 WBS 組成部分而準備的一份經批準的預算。不包括管理儲備。 注意&#xff1a;按照計劃截止目…