动态规划 求解组合数

dp方程

 dp[n][r]=dp[n-1][r]+dp[n-1][r-1]

边界条件

 dp[r][0]=1

开始条件

i=1,i<=MAX

j=1,j<=i

MAX = 100
dp = [
    [
        0 for i in range(MAX + 1)
    ]
    for i in range(MAX + 1)
]

def fac(n):
    return 1 if n < 2 else n * fac(n - 1)


def comb(n, r):
    return fac(n) // fac(r) // fac(n - r)

# dp[n][r]=dp[n-1][r]+dp[n-1][r-1]
# dp[r][0]=1
for i in range(MAX + 1):
    dp[i][0] = 1

for i in range(1, MAX + 1):
    for j in range(1, i + 1):
        dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1]

for i in range(0, MAX + 1):
    for j in range(0, i + 1):
        print(i, j, dp[i][j], comb(i, j))

0 0 1 1
1 0 1 1
1 1 1 1
2 0 1 1
2 1 2 2
2 2 1 1
3 0 1 1
3 1 3 3
3 2 3 3
3 3 1 1
4 0 1 1
4 1 4 4
4 2 6 6
4 3 4 4
4 4 1 1
5 0 1 1
5 1 5 5
5 2 10 10
5 3 10 10
5 4 5 5
5 5 1 1
6 0 1 1
6 1 6 6
6 2 15 15
6 3 20 20
6 4 15 15
6 5 6 6
6 6 1 1
7 0 1 1
7 1 7 7
7 2 21 21
7 3 35 35
7 4 35 35
7 5 21 21

猜你喜欢

转载自my.oschina.net/ahaoboy/blog/1813947
今日推荐