1.超级丑数
超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组 primes 中。
给你一个整数 n 和一个整数数组 primes ,返回第 n 个 超级丑数 。
题目数据保证第 n 个 超级丑数 在 32-bit 带符号整数范围内。
方法一:动态规划
#方法一:动态规划
def nthSuperUglyNumber(n,primes):
dp=[0 for i in range(n+1)] #dp[i] 表示第i个丑数
dp[1]=1 #第一个丑数
point=[1 for i in range(len(primes))] #point[i]表示基础丑数对应的位置,即第几个丑数,*对应的prime[i]得到丑数
for i in range(2,n+1):
tem=[] #保存可能出现的丑数,要进行排除,选出最小的可能的丑数
for j in range(len(primes)):
tem.append(primes[j]*dp[point[j]]) #可能的丑数
dp[i]=min(tem) #为最小的可能值
for j in range(len(primes)):
if primes[j]*dp[point[j]]==dp[i]:
point[j]+=1 #指针移动,找到最小丑数对应的基础丑数位置,然后移动,避免重复
return dp[-1]
2.零钱兑换
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
你可以认为每种硬币的数量是无限的。
方法一:动态规划
#方法一:动态规划
def coinChange(coins,amount):
dp=[[amount+1]*(amount+1) for i in range(len(coins)+1)] #dp[i][j] 表示前i种硬币换成j元的最小硬币数目
dp[0][0]=0 #初始化
for i in range(1,len(coins) +1):
for j in range(amount + 1):
if j<coins[i-1]:
dp[i][j]=dp[i-1][j] #容量不够
else:
dp[i][j]=min(dp[i-1][j],dp[i][j-coins[i-1]]+1) #状态转移方程
res=dp[-1][-1]
return res if res!=amount+1 else -1 #判断有没有找到