引言
貪心:人只要有 “需求“ ,都會有有點“貪“, 這種“貪“是一種選擇,或者“”取舍“
RTS(即時戰略)游戲: 帝國時代里 首先確保擁有足夠的人口 足夠的糧食,足夠的戰略資源 足夠的兵力才能發起一次“圍剿”
當然 也可以邊戰斗 邊收集資源 升級時代等等 你會發現,但選擇升級時代 時,資源種類多了一些 兵種也會有一些變化 (好像在說廢話…)當然只要能快一點 擊敗敵人 這樣融合軍事,收集資源 城建 模擬貨幣交易 的游戲 才是真正的玩 腦子游戲 (這是 個人定義 )
你能看出來哪里 貪心的選擇?
人口;多一些勞動力
收集資源 人口一多 可以壓榨(軍閥模擬器?)哈哈,人要想為自己而活 是不能做到的 當然(美利堅)除外 恨不得自己…
為集體人民而活 短期來看沒一點成果,但長期 看到會有點收獲
這好比現實生活 短期投資 沒一點回報,但只要時間充足 一定會一些回報
足夠的戰略資源 : 糧食中的大豆(帝國時代沒有大豆) 作為戰略資源 確定有點變態 那頭惡臭味的鷹 引起了他的注意
兔子團購鷹豆,鷹反而說一些:由于天氣xxx 推遲 結果買的是虛價 賣的 確是陰間價 這就是那鷹的作風 看不起兔子
只能說“從此我已八嘎呀路“這位原神玩家請你出去 不要再這里鬧!
足夠的兵力 :這不就是必備的 ,
升級時代: 滿足一定的條件: 升級時代好處在于使用當前最新的科技 和最新的軍種
食物 滿足800 ,木材 1000 黃金(貨幣)500 統統滿足了 …
隨著時代的更變 若集體不前進 就會挨打的
開放世界類型也是一樣的道理
以原神為例 當你選擇了某個任務 必須做完為止中間不能跳過,才可以接下一個任務 當然原神是非常自由的 想打啥就打啥 缺啥補充啥.這樣 才有樂趣這是所謂的動態平衡 原神有一個點 叫謀權篡位 ,神突然死 去,當人們面對自己危在旦夕璃月需要變成人的政權。也是人主導 并且化解這場危機當然也非常的末代皇帝 味道 鐘離表示:我累了 守護你們這么多年了 我就得意使絆子 “我特意假死 看看情況沒想到卻 … 好吧,人畢竟是未來 到是便宜了,胡桃”…我選擇以人身份活著 那也不錯 派蒙:一個社會“廢人” 調侃 確實正確 好在有往生堂胡堂主 做客卿 …
貪心算法核心思想
貪心:謀取自身的利益,做出不能改變想法,只能一直做下去直到找到 ,或者沒找到
定義一種選擇
這種選擇可能能找到問題的解 (局部最優解)若不能找到問題的解(局部最優解)返回錯誤值 ,能找到問題的解(局部最優解)直接返回
這種選擇找不到全局最優解,
比方:每次只看播放量 很高的視頻作品 ,點贊量 很高 即使再拉也就短暫, 而不是長期
比如說:某一些電視劇角色看起來,風風光光,背后暗箱操作,結果為自己罪行買單(你們肯定知道我要說的是誰:高啟強)
所以但凡人都會有私心想怎么搞最大化 以及風險小的利益
不考慮長久 只考慮當前如何最優
數據結構 圖: 每次選擇最近的頂點 作為深度優先遍歷
貪心算法實現思路
錢幣找零 大家非常不陌生,但移動支付打破了格局 讓小偷都 只敢偷手機了 可得知信息安全重要性,
但錢包可能在一些老人可是還在用紙幣,讓我們回憶回憶如何通過紙幣來找零錢
我們先不管五毛 只 找整
首先這些面值為 1塊錢 2塊錢 5塊錢 10塊錢 20塊錢 50塊錢 100塊錢
但只是面值 有多少張 才是硬道理 總不能沒有吧 那怎么發行 那怎么流通 ?
所以這個紙幣的張數這就來 首先說明一下 銀行怎么做我們就怎么做 交易限制 在5wRMB 每日
但我們比還有狠 直接 1塊錢(20張) 2塊錢(6張) 5塊錢(3張) 10塊錢 (6張) 20塊錢(2張) 50塊錢(3張) 100塊錢 (5張)一共是807元 倘若給我找600塊 若是從1塊開始找 效率低下 你想想誰會用這種方法! 很明顯最大 開始
貪心應用算法專區
#include<iostream>
using namespace std; // 定義一個常量N為7,表示紙幣面額的數量
const int N = 7; // 定義一個數組paperMoney,存儲紙幣的面額
const int paperMoney[N] = { 1,2,5,10,20,50,100 };
// 定義一個數組paperMoneyCount,存儲每種面額紙幣的數量
const int paperMoneyCount[N] = { 10,2,3,1,2,3,5 }; // 定義一個函數change,輸入是需要找零的金額,輸出是需要多少張紙幣
// 這個函數用于計算找零所需的紙幣數量
int change(int Money) { int num = 0; // 初始化紙幣數量為0 for (int i = N - 1; i >= 0; i--){ // 從大到小遍歷紙幣面額 int currentPaperMoneyCounts = Money / paperMoney[i] ; // 計算需要多少張當前面額的紙幣 int PaperMoneyCounts = currentPaperMoneyCounts < paperMoneyCount[i] ? currentPaperMoneyCounts : paperMoneyCount[i]; // 如果當前面額的紙幣數量不足,則使用全部數量 // 輸出需要多少張當前面額的紙幣 cout << "需要" << paperMoney[i] << "面值紙幣" << "兌換 " << PaperMoneyCounts <<" 張" << endl; Money -= PaperMoneyCounts* paperMoney[i]; // 從需要找零的金額中減去已經使用的當前面額紙幣的總價值 num += PaperMoneyCounts; // 增加已經使用的紙幣數量 if (Money<=0){ // 如果已經沒有需要找零的金額,跳出循環 break; } } if (Money>0){ // 如果最后還有需要找零的金額,說明無法找零,返回-1 num = -1; } return num; // 返回需要的紙幣數量或者-1(無法找零)
} // 主函數,程序的入口點
int main(void) { int Money; // 定義一個變量存儲需要找零的金額 cout << "請輸入需要找零的紙幣:"; cin >> Money; const int ret = change(Money); // 調用change函數計算需要的紙幣數量if (cin&&ret!=-1){ // 如果用戶輸入成功且沒有無法找零的情況,輸出需要的紙幣數量 cout <<"需要" << ret << "張紙幣才能找零" << endl; } else { cout << "找不開!" << endl; } return 0;
}