換錢的方法數

2021-08-04 15:21:15 字數 1780 閱讀 7589

1.給定陣列arr,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種貨幣都可以使用任意張,再給定乙個整數aim代表要找的錢數,求組成aim的最少貨幣數。

方法一:暴力遞迴

遞迴部分**,a[index]*i就是用幾張a[index]

process(a,0,target)

defprocess

(a,index,target):

res=0

if index==len(a):

if target==0:

res=1

else:

res=0

else:

i=0while a[index]*i<=target:

res+=process(a,index+1,target-a[index]*i)

i+=1

return res

方法二:動態規劃

while true:

try:

f=map(int,raw_input().strip().split())

a=map(int,raw_input().strip().split())

n=f[0];target=f[1]

dp=[[0

for i in

range(target+1)] for j in

range(n)]

for i in

range(n):

dp[i][0]=1

for i in

range(1,target+1):

if i%a[0]==0:

dp[0][i]+=1

for i in

range(1,n):

for j in

range(1,target+1):

num=0

k=0while a[i]*k<=j:

num+=dp[i-1][j-arr[i]*k]

k+=1

dp[i][j]=num

print dp[n-1][target]

except:

break

化簡一:

for i in

range(1,n):

for j in

range(1,target+1):

dp[i][j]=dp[i-1][j]

if j-a[i]>=0:

dp[i][j]+=dp[i][j-a[i]]

化簡二:

while true:

try:

f=map(int,raw_input().strip().split())

a=map(int,raw_input().strip().split())

n=f[0];target=f[1]

dp=[0

for i in range(target+1)]

dp[0]=1

for i in range(1,target+1):

if i%a[0]==0:

dp[i]+=1

for i in range(1,n):

for j in range(1,target+1):

if j-a[i]>=0:

dp[j]+=dp[j-a[i]]

print dp

except:

break

換錢的方法數

題目 給定陣列arr,arr中所有的值都為整數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數代表要找的錢數,求換錢有多少種方法。舉例 arr 5,10,25,1 aim 0 組成0元的方法有1種,就是所有面值的貨幣都不用。所以返回1。arr 5,10,25,1 ai...

換錢的方法數

題目 給定陣列arr,所有元素都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim代表要找的錢數,求換錢有多少種方法。舉例 arr 5,10,25,1 aim 0 返回1。組成0元的方法有一種,即所有貨幣都不用 arr 3,5 aim 2 返回0。無法組成2...

換錢的方法數

給定陣列arr,設陣列長度為n,arr中所有的值都為正整數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim,代表要找的錢數,求換錢的方法數有多少種。由於方法的種數比較大,所以要求輸出對10 9 7進行取模後的答案。輸出包括兩行,第一行包括兩個整數n 0 n 10...