回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一堆现金票据<code>[5, 10, 20, 50, 100, 500]</code>给定一个值<code>x</code>,找到与该值相加的最小可能票据,然后返回这些票据在数组中的出现次数。我们假设我们只能接收被<code>min(cash) = 5</code>整除的数字</p>
<p>例如</p>
<pre><code>x = 5:
return [1, 0, 0, 0, 0, 0]
</code></pre>
<p>以最少数量的音符接收5,5出现一次</p>
<p>另一个例子</p>
<pre><code>x = 1000
return [0, 0, 0, 0, 0, 2]
</code></pre>
<p>因为最少的钞票是两张500美元。它们出现两次。
这应该很容易,也许是的,我想我快到了,但似乎无法绕过最后的障碍</p>
<p>到目前为止,我的代码是:</p>
<pre><code>def atm(x, cash=[5, 10, 20, 50, 100, 500]):
count_5 = 0
count_10 = 0
count_20 = 0
count_50 = 0
count_100 = 0
count_500 = 0
if x == 5:
return [1, 0, 0, 0, 0, 0]
elif x == 10:
return [0, 1, 0, 0, 0, 0]
elif x == 20:
return [0, 0, 1, 0, 0, 0]
elif x == 50:
return [0, 0, 0, 1, 0, 0]
elif x == 100:
return [0, 0, 0, 0, 1, 0]
elif x == 500:
return [0, 0, 0, 0, 0, 1]
flag = None
for c in cash:
if c < x:
flag = c
temp_balance = round(x - flag, 2)
if flag or temp_balance == 5:
count_5 += 1
if flag or temp_balance == 10:
count_10 += 1
if flag or temp_balance == 20:
count_20 += 1
if flag or temp_balance == 50:
count_50 += 1
if flag or temp_balance == 100:
count_100 += 1
if flag or temp_balance == 500:
count_500 += 1
return [count_5, count_10, count_20, count_50, count_100, count_500]
print(atm(150))
</code></pre>
<p>这返回的是<code>[1, 1, 1, 1, 1, 1]</code>,这不正确,正如我所期望的<code>[0, 0, 0, 1, 1, 0]</code>。我做错了什么?如何修复</p>
<p>我已经部分使用了这个YouTube<a href="https://www.youtube.com/watch?v=8JwdenBGmEo&ab_channel=KevinNaughtonJr." rel="nofollow noreferrer">video</a>,但是我没有使用递归</p>
<p>我也在考虑这个问题的时间复杂性,但在创建更高效算法的早期阶段。因此,如果有更好的方法代替所有这些<code>if</code>{<cd7>}语句,那么我想从中学习</p>