查找总和等于k的子集数量

时间:2015-03-11 13:36:30

标签: 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];
    }

2 个答案:

答案 0 :(得分:3)

您的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];

(希望我没有遇到小问题,没有对它进行测试 - 但是一旦递归公式明确,它应该会让你知道如何实现它)

答案 1 :(得分:0)

您可以使用以下示例查找总和等于k的子集的数量:

#include <iostream>

using std::cout;
using std::cin;

int count = 0,K;
void noofsubsets(int arr[], int sum, int N){
    if(N==0){
        if(sum==K)
            count++;
        return;
    }
    noofsubsets(arr, sum, N-1);
    noofsubsets(arr, sum+arr[N-1], N-1);
}