n个解决方案无法工作的非连续元素

时间:2015-09-29 18:47:45

标签: algorithm recursion dynamic-programming memoization

计算可被n整除的给定整数数组的非连续子序列数的有效方法是什么? A = {1,2,3,2} n = 6 产量 3 因为12,12,132可以被6整除

我使用动态编程的解决方案给了我错误的结果。它总是给我一个比实际结果更多的东西。

#include <stdio.h>

#define MAXLEN 100
#define MAXN 100
int len = 1,ar[] = {1, 6, 2},dp[MAXLEN][MAXN],n=6;

int fun(int idx,int m)
{
    if (idx >= (sizeof(ar)/sizeof(ar[0])))
        return m == 0;
    if(dp[idx][m]!=-1)
        return dp[idx][m];
    int ans=fun(idx+1,m);                // skip this element in current sub-sequence
    ans+=fun(idx+1,(m*10+ar[idx])%n);    // Include this element. Find the new modulo by 'n' and pass it recursively
    return dp[idx][m]=ans;
}
int main()
{
    memset(dp, -1, sizeof(dp));
    printf("%d\n",fun(0, 0));            // initially we begin by considering array of length 1 i.e. upto index 0
    return 0;
}

有人能指出错误吗?

1 个答案:

答案 0 :(得分:2)

问题是&#34;空&#34;序列被视为一种解决方案(m == 0当您开始通话时,不添加任何数字会在最后留下m == 0

这是正确的,但是{1, 2, 3, 2}的解决方案是4,或者您需要通过仅作为回复fun(0, 0)-1来减去它。