これは、典型的な動的計画法 (dynamic programming) を用いる問題で、d[sum] という状態を管理します。d[sum] は、「許可された数を組み合わせて sum を作る方法が何通りあるか」を表します。
N = ...
nums = [...]
d = [0] * (N + 1) # d[i] は、i を作り上げることのできる全パターン数
d[0] = 1 # 0 を作る方法は何も選ばない 1 通りだけ
for i in range(1, N + 1): # 1 から N まで順番に作り上げる
for num in nums: # num を使って d[i] を更新
if i - num >= 0: # num を使って i を作り上げる事が可能かどうか
d[i] += d[i - num]
print(d[N])
このように、d[i] は「許可された数 nums を使って i を作る方法の総数」として定義します。まずはすべて 0 に初期化しますが、d[0] だけは 1 とします。これは、「何も選ばない方法で 0 を作る」手段がちょうど 1 通りあることを表しています。これ以外の数 i については、nums に含まれる数を使ってどのように i を作れるかを順に検討していきます。