算法|给定一个数组[]和k,找到子集的数量和k的倍数

时间:2016-01-26 19:58:47

标签: c arrays algorithm data-structures subset-sum

给定array[]正整数和另一个整数k,我必须找到其总和为k的倍数的子集数(sum可被{整除] {1}})。

例如,

k

子集总和是,

array[] = {1, 2, 3, 4}, k = 3

因此,1 = 1 1 + 2 = 3 1 + 2 + 3 = 6 1 + 2 + 3 + 4 = 10 2 = 2 2 + 3 = 5 2 + 3 + 4 = 9 3 = 3 3 + 4 = 7 4 = 4 {3, 6, 9}的倍数,答案是k = 3。对于上面的同一个数组3,答案为k = 2 如何有效地实现阵列大小 100万

2 个答案:

答案 0 :(得分:2)

这是Subset Sum Problem的近似变体,与原作一样,它是NP-Complete(从Partition Problem减少是微不足道的。)

可以通过遵循递归公式使用动态编程来解决:

D(0,0) = true
D(0,x) = false       x > 0
D(i,x) = false       x < 0
D(i,x) = D(i-1,x) OR D(i-1,x-arr[i])

在此处,D(i,x)为真,当且仅当您可以使用第一个i元素的子集来构建数字x

这可以使用动态编程有效地计算。

完成后,只需计算i的值数D(n,k*i) = true

这将花费O(n*W)时间,其中n是元素数量,W是它们的总和。

答案 1 :(得分:0)

这似乎是使用递归的明确用法。

表示数组中的每个值

单独测试值

测试剩余数组的所有组合,包括增值和无增值。