求最大值列表中所有和为指定值的整数组合高效算法
寻找高效的整数组合生成算法
给定一个元素数量≥1的整数最大值列表,需要找出所有满足以下条件的整数组合:
- 组合中每个元素不超过最大值列表对应位置的数值
- 组合所有元素的总和等于指定目标值
比如最大值列表为[2, 3, 0, 5],目标值为5时,有效组合如下:
[2, 3, 0, 0] [2, 2, 0, 1] [2, 1, 0, 2] [2, 0, 0, 3] [1, 3, 0, 1] [1, 2, 0, 2] [1, 1, 0, 3] [1, 0, 0, 4] [0, 3, 0, 2] [0, 2, 0, 3] [0, 1, 0, 4] [0, 0, 0, 5]
目前找到的相关算法只能生成由列表中元素直接相加得到目标值的情况(比如上述示例中的[2,3]和[5]),无法满足完整需求。我已经用Swift实现了暴力解法,但希望获得更高效的算法:
import UIKit let avail = [2, 3, 0, 5] let sol = [0, 0, 0, 0] var solList = [[Int]]() let target = 5 let inc = 1 var calls = 0 generate(soln: sol, idx: 0) print("calls : \(calls) solutions \(solList.count)") for entry in solList { print(entry) } func generate(soln: [Int], idx: Int) -> Void { calls += 1 let solnTotal = soln.reduce(0, +) if solnTotal > target {return} if solnTotal == target { solList.append(soln) //print(soln) return } if idx == soln.count {return} var tmp = soln[idx] while tmp <= avail[idx] { var solNext = soln solNext[idx] = tmp let solnTotal = solNext.reduce(0, +) if solnTotal > target {break} generate(soln: solNext, idx: idx + 1) tmp += inc } }
内容的提问来源于stack exchange,提问作者Jim Burke
相关产品推荐
相关产品推荐

