繁体   English   中英

用于浮点数子集和问题的递归 function

[英]recursive function for subset sum problem with floating-point numbers

我为子集总和问题做了一个递归 function f(s,x) ,当从一组值x中选择元素时,它能够产生所有唯一的组合,这些组合总和为目标总和 's'。

例如,假设x <- c(2,4,8,10) ,并且s <- 10表示目标总和,下面的 function f

f <- function(s, x, xhead = head(x,1), r = c()) {
  if (s == 0) {
    return(list(r))
  } else {
    x <- sort(x,decreasing = T)
    return(unlist(lapply(x[x<=min(xhead,s)], function(k) f(s-k, x[x<= s-k], min(k,head(x[x<=s-k],1)), c(r,k))),recursive = F)) 
  }
}

我可以获得子集总和的所有组合,即

> f(s,x)
[[1]]
[1] 10

[[2]]
[1] 8 2

[[3]]
[1] 4 4 2

[[4]]
[1] 4 2 2 2

[[5]]
[1] 2 2 2 2 2

上面的 function 适用于xs整数。 但是,当我将x s x s ,那么 output 就变成了不想要的:

> f(s/10,x/10)
[[1]]
[1] 1

但所需的 output 应该像

> Map(function(v) v/10, f(s,x))
[[1]]
[1] 1

[[2]]
[1] 0.8 0.2

[[3]]
[1] 0.4 0.4 0.2

[[4]]
[1] 0.4 0.2 0.2 0.2

[[5]]
[1] 0.2 0.2 0.2 0.2 0.2

我怀疑我的 function f在处理浮点数时一定有一些问题,但经过多次试验后未能解决。 任何人都可以帮我解决这个问题,而无需对 function f进行大改动吗?

提前感谢任何帮助!

您可以在减法中使用round并设置小数点

f <- function(s, x, xhead = head(x,1), r = c()) {
  if (s == 0) {
    return(list(r))
  } else {
    x <- sort(x,decreasing = T)
    return(unlist(lapply(x[x<=min(xhead,s)], function(k) f(round(s-k, 4), x[x<= round(s-k, 4)], min(k,head(x[x<= round(s-k, 4)],1)), c(r,k))),recursive = F)) 
  }
}

f(s/10,x/10)

返回所需的 output:

[[1]]
[1] 1

[[2]]
[1] 0.8 0.2

[[3]]
[1] 0.4 0.4 0.2

[[4]]
[1] 0.4 0.2 0.2 0.2

[[5]]
[1] 0.2 0.2 0.2 0.2 0.2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM