1.给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种货币都可以使用任意张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数。
方法一: 暴力递归
递归部分代码,A[index]*i就是用几张A[index]
process(A,0,target)
def process(A,index,target):
res=0
if index==len(A):
if target==0:
res=1
else:
res=0
else:
i=0
while 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=0
while 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