コインを交換する
時間制限:1秒メモリ制限:128 MB
题目描述
理学部は、額面がN(1 <= N <= 10)の紙幣があると仮定して、1元と2元の2つの異なる変更を考慮して、コイン交換イベントを開催します。数に制限はありません。このNドルのノートを変更に交換する場合、いくつの異なる方法がありますか?
たとえば、額面が4の紙幣には、次の5つの変更方法があります
。4= 1 + 1 + 1 + 1 + 1
4 = 2 + 1 + 1
4 = 1 + 2 + 1
4 = 1 + 1 + 2
4 = 2 + 2
プログラミングは再帰的な方法を使用して上記の問題を解決します。
入力
只有一个数N,代表纸币面值
アウトプット
输出一个数,代表所有不同的兑换方法的总数
入力例
4
出力例
5
ソリューション1:シミュレーション(暴力は奇跡です)
N = int(input())
def dfs(N):
if(N==0):
return 1;
count1 = 0
count2 = 0
if(N-1 >= 0):
count1 = dfs(N - 1)
if(N - 2 >= 0):
count2 = dfs(N - 2)
return count1 + count2
print(dfs(N))
答えは:[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
後の項の値は、最初の2つの項の合計に等しいことがわかりました。関数
は次のように変更できますdfs()
。
def dfs(N):
if N == 1:
return 1
if N == 2:
return 2
return dfs(N-1)+dfs(N-2)
ソリューション2:メモリ付きバックパック(効率の向上)
N = int(input())
#data列表记录已经算出过的值,避免重复计算
data = [0]*1001
def dfs(N):
#data为全局变量,记录下来修改过的data列表的值
global data
if(data[N] != 0):
return data[N]
if(N == 1):
return 1
if(N == 2):
return 2
# 把算出来的值添加进data列表
data[N] = dfs(N-1) + dfs(N-2)
return dfs(N-1) + dfs(N-2)
print(dfs(N))
解決策3:(動的プログラミング-近日公開)
状态转移方程
:f(n)= f(n-1)+ f(n-2)
N = int(input())
def dp(N):
data = [0,1,2]
for i in range(3,N + 1):
data.append(data[i-1] + data[i-2])
return data[N]
print(dp(N))
解決策4:時計を再生する(ojスコアアーティファクト、あらゆる種類の不従順、時間の複雑さO(1)に特化)
N = int(input())
data = [0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711]
print(data[N])