要求:给定数组coin,coin中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个num,代表要找的钱数,求组成num的最少货币数。如果无解,请返回-1. 思路: 1、生成num+1长度的数组,数组的值为num+1 2、循环选取1到num的数i,若i小于coin中每一个值,则数组的值不变;若i大于coin中的值,则根据ans[i]=min(ans[i],ans[i-j]+1)更新数组值 备注:ans[i]=min(ans[i],ans[i-j]+1)表示为了换i块钱,可以通过方案:coin中一张j面值的货币+(换i-j面值的最小货币张数)实现。 3、直到循环到num位置,该位置表示换取num所需的最小张数。如果该值小于初始值num+1,则返回该值,否则返回-1. 备注:-1表示无法换刚刚好num块钱;coin里面是空值;coin里面的数太大,num太小,无法换取。 def coinchange(coins,num): ans = [num+1]*(num+1) ans[0]=0 for i in range(1,num+1): for j in coins: if i >= j : ans[i]=min(ans[i],ans[i-j]+1) return ans[num] if ans[num]!=(num+1) else -1