我从我的一位教授那里得到this problem来解决R.这就是我想出的:
buttons <- c(16,23,61,7,7,7,13,13,13,19,19,21,27,56,56,73,77,87,11,37,41)
combos<- NULL
for(bb in 1:80000){
random<-sample(buttons,5,replace=FALSE)
#A*B+C-D+E
combos[bb]<-(random[1])*(random[2])+(random[3])-(random[4])+(random[5])
}
solutions<-c(917,134,1569,1649,1431,1622,233,2094,1072,915,
1922,2437,2714,2491,1886,2812,426,1673,94,2139,2569,496,2249,1553,1580)
solutions %in% combos
我认为代码正在做什么:
但是,当应该有1个假时,布尔值会返回25个真值。我哪里出错了?
答案 0 :(得分:5)
我不知道你为什么试图用随机抽样来解决这个问题。你永远不会相信任何答案,除了你可以得到所有的零食。我会用这个:
buttons <- as.integer(buttons)
solutions <- as.integer(solutions)
#create all combinations of 5 buttons
combos <- t(combn(buttons, 5))
library(combinat)
#permute the combinations
tmp <- lapply(permn(1:5), function(i, solutions, combos) {
#which solutions can be derived from the permuted combination?
solutions[solutions %in% (combos[,i[1]] *
combos[,i[2]] +
combos[,i[3]] -
combos[,i[4]] +
combos[,i[5]])]
}, solutions = solutions, combos = combos)
#which solution can not be achieved?
solutions[!(solutions %in% unlist(tmp))]
然而,这并没有给我一个我无法得到的零食。也许我误解了措辞。
答案 1 :(得分:2)
对于初学者,请删除for循环。这是非常低效的:
random <- matrix(replicate(8e4, sample(buttons,5,replace=F)), ncol=5, byrow=TRUE)
combos <-random[,1]*random[,2]+random[,3]-random[,4]+random[,5]
当我扩展到一百万个组合时,它每次都匹配所有TRUE。我可能在问题中没有看到一些混乱。或者你的教授是一个非常残酷的人。
更新:
我更改了注释中提到的按钮向量:
solutions[!solutions %in% combos]
[1] 2437
谢谢,我可以按照我定期的生活继续前进。采样并不是最好的方法,但问题已经解决了。