a 國一共發行了幾種不同面值的硬幣,分別是面值 1 元,2 元,5 元,10 元,20 元,50 元, 100 元。假設每種面值的硬幣數量是無限的,現在你想用這些硬幣湊出總面值為 n 的硬幣, 同時你想讓選出的硬幣中,不同的面值種類盡可能多;在面值種類盡可能多的情況下,你想 讓選擇的硬幣總數目盡可能多,請問應該怎麼選擇硬幣呢?
第一行包含乙個數字?,表示要湊出的面值。1 ≤ ? ≤ 109
輸出兩個整數,分別表示最多能有多少種型別的硬幣以及在型別最多的情況下最多能用上多少枚硬幣。
輸入
輸出2 2解釋
目標值是3, 需要1, 2兩種硬幣, 面值分別為1, 2共兩個輸入 輸出
3 5解釋
需要1, 2, 5三種面值, 硬幣選擇為 1, 1, 1, 2, 5共5枚。
# 演算法思想:
# 要求種類最多且數量最多。
# 種類最多時,我們需要盡量的先每一種硬幣取一枚, 看能否滿足條件,
# 數量最多時, 當我們每一種硬幣娶一枚, 仍有剩餘的, 就用面值為1的硬幣填補, 就可以保證數目最多
target =
int(
input()
)coins =[0
,1,2
,5,10
,20,50
,100
]_sum =[0
]*10# _sum 中每乙個元素表示: 每一種硬幣取一枚, 累加的和是多少, 目的是保證種類最多
# _sum = [0, 1, 3, 8, 18, 38, 88, 188]
# 表示,取面值為1的硬幣1個, 面值總和為1
# 取面值為1, 2的硬幣各乙個, 兩種硬幣, 面值總和為3
# 面值為1, 2, 5 的硬幣各乙個, 三種硬幣, 面值總和為5
# .......
# 這樣, 我們就知道,每一種硬幣只取乙個時, 面值總和是多少。
for i in
range(1
,len
(coins)):
_sum[i]
= _sum[i-1]
+ coins[i]
# 從後往前查詢
# target = 100 為例:
# 首先我們應該先保證種類的數目,_sum陣列從後往前查詢,即先每種面值都先取乙個, 取7種面值, 總和是188, 超過了100, 因此不選100面值的硬幣
# 然後我們找_sum陣列的倒數第二個位置,取6種面值的硬幣各乙個, 總和88, 小於100, 所以面值種類可以是6, 就是輸出中的下標 i
# 下面確定硬幣數目。
# 6種面值各乙個共88元, 已有i(這裡是6)個硬幣。
# 還差(target-_sum[i])元, 這些面值全部用1元硬幣填補, 需要 (target-_sum[i])個一元硬幣。
# 最終總和是 i + (target-_sum[i]) 個硬幣。
i =7
while i >=1:
if target >= _sum[i]
:print
(i, target-_sum[i]
+i)break
i -=
1
美團點評2018秋招筆試題之硬幣兌換
a 國一共發行了幾種不同面值的硬幣,分別是面值 1 元,2 元,5 元,10 元,20 元,50 元,100 元。假設每種面值的硬幣數量是無限的,現在你想用這些硬幣湊出總面值為 n 的硬幣,同時你想讓選出的硬幣中,不同的面值種類盡可能多 在面值種類盡可能多的情況下,你想讓選擇的硬幣總數目盡可能多,請...
c 牛客刷題(美團2017真題)
請設計乙個演算法能夠完成兩個用字串儲存的整數進行相加操作,對非法的輸入則返回error 輸入描述 輸入為一行,包含兩個字串,字串的長度在 1,100 輸出描述 輸出為一行。合法情況輸出相加結果,非法情況輸出error示例1 輸入123 123 abd 123 輸出246 error 1 includ...
牛客網 合唱團
有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?每個輸入包含 1 個測試用例。每個測試資料的第一行包含乙個整數 n 1 n 50 表示學生的個數,接下...