美團2017秋招筆試題 拼湊錢幣

給你六種面額 一、五、十、20、50、100 元的紙幣,假設每種幣值的數量都足夠多,編寫程序求組成N元(N爲0~10000的非負整數)的不一樣組合的個數。 
輸入描述:
輸入包括一個整數n(1 ≤ n ≤ 10000)
輸出描述:
輸出一個整數,表示不一樣的組合方案數


設f[i][j]爲使用a[0]-a[i]的面額湊到j元的不一樣組合個數
#include <iostream>
#include <cstring>
using namespace std;
int a[6] = {1,5,10,20,50,100};
long long f[6][10001];
int main(){
    int n;
    cin >> n;
    memset(f, 0, sizeof(f));
    for(int j = 0; j <= n; j++){
        f[0][j] = 1;
    }

    for(int i = 1; i < 6; i++){
        for(int j = 1; j <= n; j++){
            for(int k = 0; k <= j/a[i]; k++){
                f[i][j] += f[i-1][j-k*a[i]];
            }
        }
    }
    cout << f[5][n] << endl;
    return 0;
}
相關文章
相關標籤/搜索