c++ - 查找总和等于 k ​​的子集的数量

标签 c++ algorithm dynamic-programming

任何人都可以向我解释动态算法,该算法找到总和等于 k ​​的子集数。 我在谷歌搜索,但找不到任何简单的解释!对不起我的英语不好! 这是代码:

int numbers[MAX];

int GetmNumberOfSubsets()
    {
        int dp[MAX];
        dp[0] = 1;
        int currentSum = 0;
        for (int i = 0; i < numbers.length; i++)
        {
            currentSum += numbers[i];
            for (int j = min(sum, currentSum); j >= numbers[i]; j--)
                dp[j] += dp[j - numbers[i]];
        }

        return dp[sum];
    }

最佳答案

您的 DP 解决方案应该是二维的,1 维用于求和,1 维用于元素数量。

定义这个解的递归公式是:

DP(x,i) = 0    x < 0
DP(0,i) = 1
DP(x,0) = 0    x > 0
DP(x,i) = DP(x-numbers[i],i-1) + DP(x,i-1)

它应该是这样的:

    int dp[MAX+1][sum+1];
    int i, x;
    for (i = 0; i < MAX+1; i++) { 
         dp[i][0] = 1;
    }
    for (x = 1; x < sum+1; x++) { 
         dp[0][x] = 0
    }
    for (i = 1; i < MAX+1; i++) { 
       for (x = 1; x < sum+1; x++) { 
           dp[i][x] = dp[i-1][x];
           if (x >= numbers[i])
             dp[i][x] += dp[i][x-numbers[i]];
        }
     }
    return dp[MAX][sum];

(希望我没有遇到小问题,没有测试它 - 但它应该让你知道一旦递归公式清楚后如何实现它)

关于c++ - 查找总和等于 k ​​的子集的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28988089/

相关文章:

c++ - 加密和解密部分 ASCII 表

c++ - 不确定为什么对象是本地的而不是引用的

python - 无需替换的选择 - 通过改变列表

algorithm - 广度优先搜索 : the timing of checking visitation status

c - 一个做出改变的案例(某种程度上)。找到权重的最小组成

c++ - 查找加起来等于特定数字倍数的数组子集的数量

c# - SQLite in 10 UWP App Assertion Error (p->iForeGuard==(int)FOREGUARD);

c++ - 在 SystemC 中启用 debugf

algorithm - graph - 如何获得最小权重连通子集?

c++ - 找到小于特定值的最大排列