动态编程:递归关系的制表

时间:2018-01-30 11:30:00

标签: python-3.x recursion dynamic-programming coin-change

以下递归关系解决了硬币交换问题的变化。计算我们可以求和所需值的方式的数量,同时保持求和的数量:

def count_even(coins, num_coins, req_sum, parity):
    if req_sum < 0:
        return 0
    if req_sum == 0 and not parity:
        return 1
    if req_sum == 0 and parity:
        return 0
    if num_coins == 0:
        return 0
    count_wout_high_coin = count_even(coins, num_coins - 1, req_sum, parity)
    count_with_high_coin = count_even(coins, num_coins, req_sum - coins[num_coins - 1], not parity)
    return count_wout_high_coin + count_with_high_coin

如果使用parity = False调用此代码,则会生成所需的解决方案。

我在实施制表技术以优化此算法时遇到问题。在第一次尝试时,我尝试遵循与其他DP问题相同的模式,并将奇偶校验作为问题的另一个参数,因此我编写了这个三重循环:

def count_even_tabulation(S, m, n):
    if m <= 0 or n < 0:
        return 0
    if n == 0:
        return 1
    table = [[[0 for x in range(m)] for x in range(n + 1)] for x in range(2)]
    for j in range(m):
        table[0][0][j] = 1
        table[1][0][j] = 0
    for p in range(2):
        for i in range(1, n + 1):
            for j in range(m):
                y = table[p][i][j - 1] if j >= 1 else 0
                x = table[1 - p][i - S[j]][j] if i - S[j] >= 0 else 0
                table[p][i][j] = x + y
    return table[0][n][m - 1]

但是,这种方法不会为奇偶校验创建正确的表,等于0且等于1:

[1, 1, 1]
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]

[0, 0, 0]
[1, 1, 1]
[0, 1, 1]
[0, 0, 1]
[0, 0, 0]

如何为给定的递归关系充分实现制表方法?

0 个答案:

没有答案