Java中的组合或伪代码

时间:2015-01-25 19:45:07

标签: java permutation combinatorics

我想在未来的彩票系统中生成一系列数字。每个系列由6个数字组成。这些数字是从50个不同数字的池中选出的。最初从池中删除6个号码,这6个号码成为累积奖金系列。数字顺序无关紧要 现在门票系列。一个系列有六个数字,如果它有3个或更多的数字,它与中奖号码中的数字匹配,它是一个获胜系列。因此,如果累积奖金为1,2,3,4,5,6,例如,1,2,3,7,8,9或1,2,3,4,0,19系列可被视为赢家。
现在我的问题。我想生成所有获胜的门票系列(每个门票中都有六个数字,其中有3个或更多匹配的数字)。由于顺序无关紧要,我认为数学答案是[(6选3)*(44选3)] [[(6选4)*(44选2)] + [(6选5)*( 44选择1)] + 1.如果我错了,请纠正我。但是,我也想知道如何在Java或某些伪代码中实现它。 提前感谢所有的帮助。

1 个答案:

答案 0 :(得分:1)

以下是一些Haskell,由于您对Java感兴趣,因此可能属于伪代码。

-- Return a list of tickets drawn from the numbers in nums
-- having length n and at least k numbers in common with jackpot.
winners :: Int -> Int -> [Int] -> [Int] -> [[Int]]
winners n k jackpot nums = go n k (length jackpot) nums
  where
    -- needed = count of numbers needed to fill a ticket
    -- jneeded = count of jackpot numbers needed for a winner
    -- jleft = count of jackpot numbers left in the list nums
    -- nums = remaining numbers to pick from
    go :: Int -> Int -> Int -> [Int] -> [[Int]]
    go needed jneeded jleft nums
      | needed <= 0                = if jneeded <= 0 then [ [] ] else []
      | jneeded > jleft            = []
    go needed jneeded jleft []     = []
    go needed jneeded jleft (d:ds) = useD ++ dontUseD
        where
          jneeded' = if elem d jackpot then jneeded-1 else jneeded
          jleft'   = if elem d jackpot then jleft-1   else jleft
          useD     = map (d:) $ go (needed-1) jneeded' jleft' ds
          dontUseD = go needed jneeded jleft' ds

example = print $ winners 4 2 [2,5,8] [1..9]