演算法貨幣問題
❶ 關於貨幣乘數的問題
貨幣乘數有兩種演算法,第一種:貨幣乘數=基礎貨幣/派生貨幣;第二種:貨幣乘數=1/法定存款准備金!由於銀行有信用創造的作用,因此銀行存款有派生貨幣的作用!現在央行提高法定準備金,正是通過減少貨幣乘數,減少貨幣流通量,達到緊縮的效果!
❷ 關於貨幣換算問題
0.16的倒數:1/0.16=6.25
1美金等於6.25元人民幣
❸ 【演算法 - 動態規劃】找零錢問題Ⅱ
動態規劃新解:深度探索找零錢問題Ⅱ
在動態規劃系列的璀璨篇章中,我們已經領略了四種經典模型的魅力:從左到右的精妙、范圍嘗試的巧妙、樣本對應的智慧和業務限制的實用性。今天,我們將聚焦於更具挑戰性的找零錢問題Ⅱ,給定正整數貨幣數組arr和目標金額aim,目標是計算組合方式的總數,但與問題Ⅰ不同,這里限制了每種貨幣的張數。
想像一下,當你面對arr={1,2,1,2,1,2,1},aim=4的場景,需要多少種獨特的組合方式,其中每種貨幣張數有限制。暴力遞歸的思路是關鍵,但這里我們將引入動態規劃的力量,以記憶化搜索和狀態轉移方程為武器,降低枚舉的復雜性。
暴力遞歸到動態規劃的蛻變
暴力遞歸的基礎在於:當遍歷到數組末尾,且剩餘金額為零時,我們找到了一個有效組合,計數加一。但這里的關鍵在於處理張數限制,即zhang不能超過coins[index]的值。將遞歸轉換為動態規劃,我們構建一個二維數組dp,大小為[N+1][aim+1],初始化dp[N][0]=1,從後向前填充,利用dp[i+1][rest]計算dp[i][rest],從而消減一層循環。
在優化版本中,我們觀察到一個有趣的規律:計算dp[i][rest]時,可以通過枚舉zhang,並利用dp[i+1][rest-coins[index]*zhang]來代替冗餘的循環,這就像將紅色計算簡化為淡黃色、藍色和橙色的組合,降低了復雜度,同時避免了處理藍色貨幣選擇時的邊界問題。
動態規劃的魅力與應用
動態規劃的精髓在於表依賴和記憶化,它巧妙地將復雜問題轉化為子問題的組合。在這個找零錢問題中,通過嚴格遵守狀態轉移方程,我們不僅消除了多餘的for循環,還提升了代碼的效率和可讀性。掌握動態規劃的這些技巧,就如同為演算法大廈奠定堅固的基礎,回顧過去的篇章,你將發現每一個模型都在為解決新問題提供關鍵的線索。
總結來說,動態規劃的魔力在於其簡潔的邏輯和高效的執行。通過深入理解記憶化搜索和狀態轉移,我們在找零錢問題Ⅱ中實現了從暴力遞歸到優雅動態規劃的轉變,這不僅降低了計算的復雜度,也提升了問題解決的美感。讓我們繼續在動態規劃的海洋中探索,深化理解,迎接更多演算法挑戰。
❹ C語言,貪心演算法,貨幣找零問題
貪心演算法找零就是現實中從最大面額開始找的思路。不代表是最優解,只是演算法之一。
由於面額輸入順序不定,我先對輸入的面額進行降序排序。
下面代碼:
#include <stdio.h>
#include <malloc.h>
int main()
{
int i,j,m,n,*ns=NULL,*cn=NULL,sum=0;
printf("請輸入總金額m及零錢種類n:"),scanf("%d",&m),scanf("%d",&n);
printf("請分別輸入%d種零錢的面額: ",n);
if(!(ns=(int *)malloc(sizeof(int)*n))) return 1;
if(!(cn=(int *)malloc(sizeof(int)*n))) return 1;
for(i=0;i<n;i++) scanf("%d",&ns[i]);
//------------考慮輸入面額順序不定,先對面額進行降序排列(如按照降序輸入,該段可刪除)
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(ns[j]>ns[i]) ns[j]^=ns[i],ns[i]^=ns[j],ns[j]^=ns[i];
//-------------------------------------------------------------------
for(i=0;i<n;i++)//貪心演算法,從最大面額開始
if(m>=ns[i])
cn[i]=m/ns[i],m=m%ns[i],sum+=cn[i],printf("%d元%d張 ",ns[i],cn[i]);
printf(" 最少使用零錢%d張 ",sum);
return 0;
}