在乙個國家僅有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 32768int 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 32768int 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 ...