---
# System prepended metadata

title: p147 dollars

---

# p147 dollars
某國家有貨幣種類：100元、50元、20元、10元、 5元、 2元、 1元、50分、20分、10分和5分（0.05元）。 
寫一支程式找出輸入金額的所有貨幣組合可能，順序不影響組合。例如20分有四種方法：1×20分、2×10分、10分+2×5分 和 4×5分。
## 輸入
輸入為最大300.00元的實數金額，每行一個金額。金額必定被五分整除。當輸入0時，程式結束。
## 輸出
輸出對應每行輸入的金額，每行的輸出首先為金額（精度為小數點下兩位，寬6個字元，靠右對齊），再來是該金額的可能組合數（整數，寬17個字元，靠右對齊）。
### python輸出範例
```python=3.6
print("{:6.2f}{:17d}".format(金額,組合數))
```
### C++輸出範例
```cpp=
std::cout << std::setw( 6 ) << std::fixed << std::setprecision(2)<< double(金額) ;
std::cout << std::setw( 17 )<< 組合數 << std::endl;
```
## python解答
```python=3.6
COIN_TYPE = [1,2,4,10,20,40,100,200,400,1000,2000]
NUM_COIN_TYPE = len(COIN_TYPE)
def findMaxCoin(num):
    #num>=1
    for key, coin in enumerate(COIN_TYPE):
        if coin==num:
            return key
        elif coin>num:
            return key-1
    return key
def getCombinationList(num, table):
    max_coin_idx = findMaxCoin(num)
    count = 0
    combination_table = [1]*NUM_COIN_TYPE
    for key, coin in enumerate(COIN_TYPE):
        if coin==1:#COIN_TYPE[0]
            count+=1
        elif coin==2:#COIN_TYPE[1]
            count+=num//2
        elif key<=max_coin_idx:#key>=2
            if coin==num:
                count+=1
                combination_table[key]=count
                continue
            for rest in range(num % coin, num, coin):
                count+=table[rest][key-1] if rest!=0 else 1
        combination_table[key]=count
    #if(num>2000):
    #    print(combination_table)
    return combination_table, count

def findCombinationOf(num):
    table=[]
    for i in range(num):
        if i<=1:
            table.append([1]*NUM_COIN_TYPE)
        else:
            combination_table, _ = getCombinationList(i,table)
            table.append(combination_table)
    _, count = getCombinationList(num,table)
    return count

def getCombinationListUnder(num):
    table=[]
    countList=[]
    for i in range(num):
        if i<=1:
            table.append([1]*NUM_COIN_TYPE)
            countList.append(1)
        else:
            combination_table, count = getCombinationList(i,table)
            countList.append(count)
            table.append(combination_table)
    _, count = getCombinationList(num,table)
    countList.append(count)
    #print(combination_table)
    return countList

def main():
    countList = getCombinationListUnder(6000)
    while True:
        num = input()
        num = float(num)
        idx = round(num/.05)
        if idx==0:
            break
        print("{:6.2f}{:17d}".format(num,countList[idx]))
def mainWrite():
    countList = getCombinationListUnder(6000)
    path = './Uva_p147_dollar.txt'
    with open(path, 'w') as f:
        while True:
            num = input()
            num = float(num)
            idx = round(num/.05)
            if idx==0:
                break
            print("{:6.2f}{:17d}".format(num,countList[idx]), file=f)

if __name__ == '__main__':
    main()
```