程式設計之法 換硬幣問題

2021-07-16 00:26:26 字數 1212 閱讀 9524

此解法參考:

python27 的部落格(

#include

#include

#include

using

namespace

std;

const

int maxn = 10; // 硬幣用類數最大值

const

int maxsum = 1000;// 要兌換的錢數的最大值

/*** dp[i][j] : 使用 i 中硬幣 兌換 j 元錢的組合的種類數

* xi : 第 i 種硬幣使用的個數

if xi == 0 then dp[i][j] += dp[i-1][j]

if xi == 1 then dp[i][j] += dp[i-1][j-xi*vi] vi 表示 第 i 種硬幣的面額

until

xi == j / vi then 最後求和之後的 dp[i][j] 即為使用 i 種硬幣兌換 sum 元錢的組合的種類數

則遞推公式為 --> dp[i][j] = dp[i-1][j] + dp[i-1][j-vi] + ··· + dp[i-1][j-(j/vi)*vi];

最後要求的及為 dp[n][sum]

其中dp[i][0] = 1; i = 0,1,2,3,...,maxn --> 使用任意種硬幣兌換 0 元 都是只有 1 種方法

dp[0][sum] = 0; sum = 1,2,3,...,maxsum --> 只用0種硬幣兌換任何錢都是 0 種方法**/

int dp[maxn][maxsum] = ; // dp[i][j] : 使用 i 中硬幣 兌換 j 元錢的種類數

int main()

// begin

dp[0][0] = 1; // 使用 0 種硬幣兌換 0 元的方法 有 1 種 --> 起始點

for(int i = 1; i <= n; ++i) // 從 1 種 硬幣開始,0種硬幣已經初始化完成

else}}

}// end

cout

<< dp[n][sum];

return

0;}

樣例輸入

100

4 1 2 5 10

樣例輸出

2156

《程式設計之法》 跳台階

乙個台階總共有n級,如果一次可以跳1級 2級 3級。求總共有多少種跳法。如果整個台階只有1級,則只有一種跳法 如果台階只有2級,則有兩種跳法 如果台階只有3級,則有四種跳法。推廣到一般情況,記f n 為n級台階的跳法。當n 3時,第一次跳1級還是2級還是3級,決定了後面剩下的台階的跳法數目的不同。如...

《程式設計之法》 完美洗牌演算法

有乙個長度為2n的陣列,希望排序後變成。書上講了先用完美洗牌演算法將陣列排序為,然後再兩兩交換,就變為題目所要求的那樣。書上完美洗牌演算法講得很好,我這裡就簡單記錄下。注意,陣列下標是從1開始儲存要求排序的資料。首先,對於將排序為,通過觀察可以發現這樣乙個事實 任意的第i個元素都最終換到了 2i 2...

程式設計之法 字串旋轉

題目描述 給定乙個字串,要求將字串前面的若干個字元移到字串的尾部。例如 將字串 abcdef 的前3個字元 a b 和 c 移到字串的尾部,那麼原字串將程式設計 defabc 解法1 蠻力移位,include include define len a sizeof a sizeof a using ...