前言
在数学和计算机科学中,组合是指从给定的集合中选择若干元素形成一个子集的方式。本文将介绍如何求解给定n个数字的组合数量以及各个组合内容的方法。
本来在进行开开心心的工作(摸鱼),同事说,你很无聊吗?无聊我给你找个事情做啊。
我 :
好啊好啊!
一、问题
看到去重之前,是不是瞧不起人嘛,太简单了嘛。
求组合数量的方法:
使用组合公式:组合数量可以通过组合公式来计算,公式为
C ( n , k ) = n ! / ( k ! ∗ ( n − k ) ! ) C(n, k) = n! / (k! * (n-k)!) C(n,k)=n!/(k!∗(n−k)!)
其中n为总数字个数,k为每个组合中的数字个数。
使用递归:通过递归的方式,可以将问题拆分为更小的子问题,然后累加子问题的解来得到最终的组合数量。
看到去重后,是不是太瞧得起我了嘛,这谁做得来嘛。
求各个组合内容的方法:
使用回溯法:回溯法是一种通过不断尝试不同的选择来求解问题的方法。可以使用回溯法来生成所有可能的组合,并记录下每个组合的内容。
二、解决问题
1.去重前
先把没去重的写出来
fun generateCombinations(numbers: List<Int>): List<List<Int>> {
val combinations = mutableListOf<List<Int>>()
for (i in 0 until numbers.size) {
val combination = mutableListOf<Int>()
combination.add(numbers[i])
combinations.add(combination)
for (j in i + 1 until numbers.size) {
combination.add(numbers[j])
combinations.add(combination.toList())
}
}
return combinations
}
双重for循环遍历所有可能性,没什么好说的啊
2.去重后
我做不来(狗头),那怎么办呢,我可不是摆烂的人啊!那问题又来了,那怎么办呢?!chatgpt!!!
fun generateCombinations(numbers: List<Int>): List<List<Int>> {
val combinations = mutableListOf<List<Int>>()
for (i in 0 until numbers.size) {
val combination = mutableListOf<Int>()
combination.add(numbers[i])
combinations.add(combination)
for (j in i + 1 until numbers.size) {
combination.add(numbers[j])
combinations.add(combination.toList())
}
}
return combinations.distinct()
}
没错,你没有看错只多了一个distinct函数,chatgpt简直就是俺的神让我们看看源码
妈妈再也不用担心我的学习!
总结
最后来个1到256的list测试一下
fun SummationAnddeDuplication() {
val long = System.currentTimeMillis()
val numbers = mutableListOf<Int>()
for (i in 1..256){
numbers.add(i)
}
val combinations = generateCombinations(numbers)
println("Combinations:")
combinations.forEach { println(it) }
val long1 = System.currentTimeMillis()-long
println("Number of combinations: ${combinations.size}" +" time : ${long1/1000}s" )
}
fun generateCombinations(numbers: List<Int>): List<List<Int>> {
val combinations = mutableListOf<List<Int>>()
for (i in 0 until numbers.size) {
val combination = mutableListOf<Int>()
combination.add(numbers[i])
combinations.add(combination)
for (j in i + 1 until numbers.size) {
combination.add(numbers[j])
combinations.add(combination.toList())
}
}
return combinations.distinct()
}
输出
真不错呢,chatgpt辅助学习写代码真的挺有用的!
本文介绍了求解给定n个数字的组合数量以及各个组合内容的方法。通过组合公式或递归可以求解组合数量,而使用回溯法可以生成所有可能的组合内容。希望本文对读者有所帮助!如有任何问题,请随时提问。