有谁能给我解释一下动态算法,它能找到和等于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/