# 递归需要确定的i值,表明现在的位置defminCores(arr, i, rest):if i ==len(arr):return0if rest ==0else-1
res =-1
k =0while k * arr[i]<= rest:next= minCores(arr, i+1, rest - k*arr[i])ifnext!=-1:# 后续有效
res =next+ k if res ==-1elsemin(res,next+k)
k +=1return res
动态规划算法:
# 动态规划defminCore(arr, aim):
m =[[-1for i inrange(aim+1)]for j inrange(len(arr))]
m[len(arr)-1][0]=0
i =len(arr)-1while i >=0:
j =0while j <= aim:# 看左边是否越界,且合法if j - arr[i]>=0and m[i][j - arr[i]]!=-1:
m[i][j]= m[i][j - arr[i]]+1# 看下方是否合法 if i+1<len(arr)and m[i+1][j]!=-1:# m[i][j] = -1 说明左边不合法if m[i][j]==-1:
m[i][j]= m[i+1][j]# 如果都合法,取小的else:
m[i][j]= m[i+1][j]if m[i][j]> m[i+1][j]else m[i][j]
j +=1
i -=1return m[0][aim]
主函数及结果
if __name__ =="__main__":
arr =[5,2,3]
i =0
rest =20print(minCores(arr, i, rest))print(minCore(arr, rest))