我正在尝试编写一个函数来解决一个新问题:
给出以下数据:
S = c(19, 10, 12, 10, 24, 25, 22)
k = 4
我正在尝试计算一个函数。我想打印S
的最大子集,其中S'
中2个数字的任何和不能被k
均匀地除以
因此,一个答案可能是S' = [10, 12, 25]
,而另一个答案可能是S' = [10, 22, 24]
。
另一个例子:
如果S = {1, 7, 2, 4}
和K = 3
然后
1 + 7 = 8
1 + 2 = 3
1 + 4 = 5
7 + 2 = 9
7 + 4 = 11
2 + 4 = 6
即S' = {1, 7, 4}
,并且永远不会是k = 3
的倍数
答案 0 :(得分:5)
对此有一个线性时间算法。 orezvani在stackexchange的计算机科学部分的post中对此算法进行了很好的解释。 我在R中翻译了orezvani伪代码:
max_subset<-function(S,K){
R <- S %% K
Res <- c()
for(k in 1:(ceiling(K/2)-1)){
index_k = which(R==k)
index_K_k = which(R==(K-k))
if(length(index_k) >= length(index_K_k)){
Res <- c(Res, S[index_k])
}else{
Res <- c(Res, S[index_K_k])
}
}
print(R)
Res <- c(Res, S[which(R==0)][1])
if(K %% 2 == 0){
Res <- c(Res, S[which(R==(K/2))][1])
}
return(Res)
}
我尝试了其他示例:
S <- c(1, 7, 2, 4)
和K = 3
一起给1 7 4
; S <- c(3, 17, 12, 9, 11, 15)
和K = 5
一起给11 17 12 15
S <- c(3, 7, 2, 9, 1)
和K = 3
一起给7 1 3
S <- c(19, 10, 12, 10, 24, 25, 22)
和K = 4
一起给25 12 10
为了更容易理解,我尝试与伪代码尽可能相似,可能可以使用R语言特定的功能来优化我的解决方案。