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...