錢幣兌換問題

2022-03-13 18:52:03 字數 1590 閱讀 1621

在乙個國家僅有1分,2分,3分硬幣,將錢n兌換成硬幣有很多種兌法。請你程式設計序計算出共有多少種兌法。

輸入:每行只有乙個正整數n,n小於32768。

輸出:對應每個輸入,輸出兌換方法數。

sample input:

2934

12553

sample output:

718831

13137761

第一種是通過遞迴實現:

今天剛從《妙趣橫生的演算法》看到整數的劃分數的遞迴演算法。

以下是歸納出來的遞迴函式式:

設標記p(n, m)表示正整數n的所有不同劃分中,最大加數不大於m的劃分個數。

[  1             m = 1;

p(n, m) = [  p(n, n)          n < m;

[  1 + p(n, n-1)       n = m;

[  p(n, m-1) + p(n-m, m)  n > m > 1.

由於本題已經對m作出限制(m ≤3),所以要對上訴遞迴函式式作些修改

p(n, m) = 1 + p(n, n-1)  n = m;  修改為  p(n, m) = m  n = m;  因為m = 1,只有一種方案;m = 2, 2種;m = 3,3種。

#define maxsize 32768

int cnt[maxsize][4];

int partition(int n, int m)

if (1 > m || 1 > n)

if (1 == m || 1 == n)

if (n < m)

if (n == m)

return cnt[n][m] = partition(n, m - 1) + partition(n - m, m);

}int main()

return 0;

}

第二種通過數學方法實現:

設兌換成1分,2分,3分分別x, y, z個,等到乙個等式:n = 1 * x + 2 * y + 3 * z;

那麼,全是1分的只有一種;

那麼,再來計算含有3分的,在一次兌換中,最多有uplimit = n / 3個3分錢幣(向下取整),如n = 5,最多含1個3分,又如n = 7,則最多含2個;

那麼,我們列舉3分錢幣數從0個到uplimit個的情況:由於已經兌換掉i個3分錢幣,所以要從總數中減去已兌換的錢,剩下的錢可以兌換2分錢幣個數為((n - i * 3) / 2。

int countp(int n)

return cnt;

}int main()

return 0;

}

第三種通過母函式實現:

#define maxsize 32768

int cnt[maxsize];

void init()

for (i = 2; i < maxsize; i++)

for (i = 3; i < maxsize; i++) }

int main()

return 0;

}

錢幣兌換問題

problem description 在乙個國家僅有1分,2分,3分硬幣,將錢n兌換成硬幣有很多種兌法。請你程式設計序計算出共有多少種兌法。input 每行只有乙個正整數n,n小於32768。output 對應每個輸入,輸出兌換方法數。sample input 2934 12553 sample ...

錢幣兌換問題

在乙個國家僅有1分,2分,3分硬幣,將錢n兌換成硬幣有很多種兌法。請你程式設計序計算出共有多少種兌法。input 每行只有乙個正整數n,n小於32768。output 對應每個輸入,輸出兌換方法數。sample input 2934 12553sample output 718831 1313776...

錢幣兌換問題

在乙個國家僅有1分,2分,3分硬幣,將錢n兌換成硬幣有很多種兌法。請你程式設計序計算出共有多少種兌法。每行只有乙個正整數n,n小於32768。對應每個輸入,輸出兌換方法數。2934 12553 718831 13137761 參考 正確 include include define ll long ...