【数据结构】动态规划——找零钱问题解析(含c++和python代码)

时间:2025-02-09 07:06:08
step2:遍历coins列表找出小于金额的硬币面值 j j j,接着再使用 d p [ i − c o i n s [ j ] ] dp[i-coins[j]] dp[icoins[j]]来找出 i − c o i n s [ j ] i-coins[j] icoins[j]的最优解;最终金额 i i i的最优解为 1 + d p [ i − c o i n s [ j ] ] 1+dp[i-coins[j]] 1+dp[icoins[j]]
d p [ 1 ] = d p [ 0 ] + 1 = 1 dp[1]=dp[0]+1=1 dp[1]=dp[0]+1=1
d p [ 2 ] = d p [ 0 ] + 2 dp[2]=dp[0]+2 dp[2]=dp[0]+2 d p [ 2 ] = d p [ 1 ] + 1 dp[2]=dp[1]+1 dp[2]=dp[1]+1,而 d p [ 0 ] < d p [ 1 ] dp[0]<dp[1] dp[0]<dp[1],故 d p [ 2 ] = d p [ 0 ] + 2 = 1 dp[2]=dp[0]+2=1 dp[2]=dp[0]+2=1
d p [ 3 ] = 1 + d p [ 2 ] dp[3]=1+dp[2] dp[3]=1+dp[2] d p [ 3 ] = 2 + d p [ 1 ] dp[3]=2+dp[1] dp[3]=2+dp[1],而 d p [ 1 ] = d p [ 2 ] = 1 dp[1]=dp[2]=1 dp[1]=dp[2]=1,故 d p [ 3 ] = 1 + 1 = 2 dp[3]=1+1=2 dp[3]=1+1=2
d p [ 4 ] = 1 + d p [ 3 ] dp[4]=1+dp[3] dp[4]=1+dp[3] d p [ 4 ] = 2 + d p [ 2 ] dp[4]=2+dp[2] dp[4]=2+dp[2],而 d p [ 2 ] < d p [ 3 ] dp[2]<dp[3] dp[2]<dp[3],故 d p [ 4 ] = 2 dp[4]=2 dp[4]=2
d p [ 5 ] = d p [ 0 ] + 1 = 1 dp[5]=dp[0]+1=1 dp[5]=dp[0]+1=1
d p [ 6 ] = 1 + d p [ 5 ] dp[6]=1+dp[5] dp[6]=1+dp[5] d p [ 6 ] = 2 + d p [ 4 ] dp[6]=2+dp[4] dp[6]=2+dp[4] d p [ 6 ] = 5 + d p [ 1 ] dp[6]=5+dp[1] dp[6]=5+dp[1]
同理,计算出剩下所有金额的最优解: