给定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万。
答案 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)
这似乎是使用递归的明确用法。
表示数组中的每个值
单独测试值
测试剩余数组的所有组合,包括增值和无增值。