假设我有一个字符串,其字符只是 [0 - 9] 范围内的数字。例如:“2486”。现在我想找出所有数字之和可以被6整除的子序列。例如:在“2486”中,子序列是-“6”,“246”(2+ 4 + 6 = 12可以被6整除), “486”(4 + 8 + 6 = 18 可被 6 整除)等。我知道生成所有 2^n 组合我们可以做到这一点。但这是非常昂贵的。最有效的方法是什么?
编辑:
我在quora的某个地方找到了以下解决方案。
int len,ar[MAXLEN],dp[MAXLEN][MAXN];
int fun(int idx,int m)
{
if(idx==len)
return (m==0);
if(dp[idx][m]!=-1)
return dp[idx][m];
int ans=fun(idx+1,m);
ans+=fun(idx+1,(m*10+ar[idx])%n);
return dp[idx][m]=ans;
}
int main()
{
// input len , n , array
memset(dp,-1,sizeof(dp));
printf("%d\n",fun(0,0));
return 0;
}
有人可以解释一下代码背后的逻辑 - 'm*10+ar[idx])%n' 吗?为什么这里 m 乘以 10?