【问题标题】:Why does the last element reflect the number of non-negative solutions?为什么最后一个元素反映了非负解的数量?
【发布时间】:2020-07-07 16:43:59
【问题描述】:

请原谅我的天真,因为我没有太多的编程经验。在谷歌搜索一个不相关的问题时,我偶然发现了这个:

https://www.geeksforgeeks.org/find-number-of-solutions-of-a-linear-equation-of-n-variables/

我完全理解第一段(效率极低)的代码。但第二个:

def countSol(coeff, n, rhs): 

    # Create and initialize a table 
    # to store results of subproblems 
    dp = [0 for i in range(rhs + 1)] 
    dp[0] = 1

    # Fill table in bottom up manner 
    for i in range(n): 
        for j in range(coeff[i], rhs + 1): 
            dp[j] += dp[j - coeff[i]] 

    return dp[rhs]

让我很困惑。我的问题是:为什么第二个程序要计算非负整数解的数量?

我已经写了几个例子,包括文章中给出的例子,我知道它确实做到了这一点。我了解它是如何填充列表的。但我不完全理解为什么会这样。

请原谅对某些人来说肯定是一个无知的问题。但我很想理解其中的逻辑,因为我认为这样一个小片段相当聪明——它能够回答像“存在多少非负整数解”这样的一般问题(对于一些一般方程)。

【问题讨论】:

    标签: python bottom-up


    【解决方案1】:

    这个算法非常酷,展示了从不同角度寻找解决方案的力量。

    我们举个例子:3x + 2y + z = 6,其中 LHS 是左侧,RHS 是右侧。

    dp[k] 将通过用非负整数值替换 LHS 变量来跟踪获得 RHS 值 k 的唯一方法的数量。

    i 循环遍历 LHS 中的变量。该算法首先将所有变量设置为零。因此,唯一可能的 k 值为零,因此

    k        0   1   2   3   4   5   6 
    dp[k] =  1   0   0   0   0   0   0
    

    对于 i = 0,我们将更新 dp 以反映如果 x 为 1 或 2 会发生什么。我们不关心 x > 2,因为解都是非负数,而 3x 会太大. j 循环负责更新dpdp[k] 增加dp[k - 3] 因为我们可以通过将系数3 的一个副本添加到k-3 来得到RHS 值k。结果是

    k        0   1   2   3   4   5   6 
    dp[k] =  1   0   0   1   0   0   1
    

    现在算法继续使用 i = 1,更新 dp 以反映所有可能的 RHS 值,其中 x 为 0、1 或 2,y 为 0、1、2 或 3。这次是 j 循环将dp[k] 增加dp[k-2],因为我们可以通过将系数2 的副本添加到k-2 来得到RHS 值k,从而得到

    k        0   1   2   3   4   5   6 
    dp[k] =  1   0   1   1   1   1   2
    

    最后,算法合并了 z = 1、2、3、4、5 或 6,结果

    k        0   1   2   3   4   5   6 
    dp[k] =  1   1   2   3   4   5   7
    

    除了在伪多项式时间内计算答案之外,dp 还对每个 RHS

    【讨论】:

    • 感谢您提供如此清晰的解释。
    • @just_getting_started - 欢迎您!并欢迎堆栈溢出。当你收到一个问题的完整答案时,接受它。有关详细信息,请参阅stackoverflow.com/help/someone-answers。对问题/答案进行投票和接受答案通过在背景噪音中突出相关内容来帮助每个人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2015-05-21
    • 2013-11-20
    • 2015-07-25
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多