我试图在数学中做一个家庭作业,它是找到集合{1,2,…,n}的子集,其中n是在代码中给出的一个数字,我不能用子列表完成它,所以我需要得到你的数学编程的帮助。
例如,对于n= 2:
[12]
[1][2]它有两个元素。
例如,n= 3:
[1][2][3]
[12][3]
[13][2]
[23][1]
[123]它有5种元素。
它有五个元素。
N= 4:
[1][2][3][4]
[12][3][4]
[13][2][4]
[14][2][3]
[23][1][4]
[24][1][3]
[34][1][2]
[12][34]
[13][24]
[14][23]
[123][4]
[124][3]
[134][2]
[234][1]
[1234]它有15元素。
你知道怎么做吗?
我尝试过许多可能的LinkedHashSet和子列表循环,但我不知道如何完成它超过2小时,输出像这样。
Java中是否有任何库来获取这个输出?我会用手动的方式去做,但是有不同的方法。
import org.paukov.combinatorics.*;
import org.paukov.combinatorics.util.ComplexCombinationGenerator;
public class Main {
public static void main(String args[]){
// create a vector (A, B, B, C)
ICombinatoricsVector<String> vector = Factory.createVector(new String[] { "1", "2", "3"});
// Create a complex-combination generator
Generator<ICombinatoricsVector<String>> gen = new ComplexCombinationGenerator<String>(vector, 1);
Generator<ICombinatoricsVector<String>> gen2 = new ComplexCombinationGenerator<String>(vector, 2);
Generator<ICombinatoricsVector<String>> gen3 = new ComplexCombinationGenerator<String>(vector, 3);
// Iterate the combinations
for (ICombinatoricsVector<ICombinatoricsVector<String>> comb : gen) {
System.out.println(ComplexCombinationGenerator.convert2String(comb) + " - " + comb);
}
for (ICombinatoricsVector<ICombinatoricsVector<String>> comb : gen2) {
System.out.println(ComplexCombinationGenerator.convert2String(comb) + " - " + comb);
}
for (ICombinatoricsVector<ICombinatoricsVector<String>> comb : gen3) {
System.out.println(ComplexCombinationGenerator.convert2String(comb) + " - " + comb);
}
}
}
([1, 2, 3]) - CombinatoricsVector=([CombinatoricsVector=([1, 2, 3], size=3)], size=1)
([1],[2, 3]) - CombinatoricsVector=([CombinatoricsVector=([1], size=1), CombinatoricsVector=([2, 3], size=2)], size=2)
([2, 3],[1]) - CombinatoricsVector=([CombinatoricsVector=([2, 3], size=2), CombinatoricsVector=([1], size=1)], size=2)
([2],[1, 3]) - CombinatoricsVector=([CombinatoricsVector=([2], size=1), CombinatoricsVector=([1, 3], size=2)], size=2)
([1, 3],[2]) - CombinatoricsVector=([CombinatoricsVector=([1, 3], size=2), CombinatoricsVector=([2], size=1)], size=2)
([1, 2],[3]) - CombinatoricsVector=([CombinatoricsVector=([1, 2], size=2), CombinatoricsVector=([3], size=1)], size=2)
([3],[1, 2]) - CombinatoricsVector=([CombinatoricsVector=([3], size=1), CombinatoricsVector=([1, 2], size=2)], size=2)
([1],[2],[3]) - CombinatoricsVector=([CombinatoricsVector=([1], size=1), CombinatoricsVector=([2], size=1), CombinatoricsVector=([3], size=1)], size=3)
([1],[3],[2]) - CombinatoricsVector=([CombinatoricsVector=([1], size=1), CombinatoricsVector=([3], size=1), CombinatoricsVector=([2], size=1)], size=3)
([3],[1],[2]) - CombinatoricsVector=([CombinatoricsVector=([3], size=1), CombinatoricsVector=([1], size=1), CombinatoricsVector=([2], size=1)], size=3)
([3],[2],[1]) - CombinatoricsVector=([CombinatoricsVector=([3], size=1), CombinatoricsVector=([2], size=1), CombinatoricsVector=([1], size=1)], size=3)
([2],[3],[1]) - CombinatoricsVector=([CombinatoricsVector=([2], size=1), CombinatoricsVector=([3], size=1), CombinatoricsVector=([1], size=1)], size=3)
([2],[1],[3]) - CombinatoricsVector=([CombinatoricsVector=([2], size=1), CombinatoricsVector=([1], size=1), CombinatoricsVector=([3], size=1)], size=3)发布于 2015-06-22 22:57:03
这是组合学。请参阅有关您需要理解的结构的更多信息,即不重复的排列,也称为组合。
您可能对组合滑动感兴趣,这是一个关于Google的Java库,您可以将它用于您的程序。
您也可以尝试在没有库的情况下解决这个问题。这不应该太难。我想你需要使用递归。
我使用列表分区进行了测试:
import org.paukov.combinatorics.*;
import org.paukov.combinatorics.util.ComplexCombinationGenerator;
public class Main {
public static void main(String args[]){
// create a vector (1, 2, 3, 4)
ICombinatoricsVector<String> vector = Factory.createVector(new String[] { "1", "2", "3", "4" });
// Create a complex-combination generator
Generator<ICombinatoricsVector<String>> gen = new ComplexCombinationGenerator<String>(vector, 2);
// Iterate the combinations
for (ICombinatoricsVector<ICombinatoricsVector<String>> comb : gen) {
System.out.println(ComplexCombinationGenerator.convert2String(comb) + " - " + comb);
}
}
}结果是
([1],[2, 3, 4]) - CombinatoricsVector=([CombinatoricsVector=([1], size=1), CombinatoricsVector=([2, 3, 4], size=3)], size=2)
([2, 3, 4],[1]) - CombinatoricsVector=([CombinatoricsVector=([2, 3, 4], size=3), CombinatoricsVector=([1], size=1)], size=2)
([2],[1, 3, 4]) - CombinatoricsVector=([CombinatoricsVector=([2], size=1), CombinatoricsVector=([1, 3, 4], size=3)], size=2)
([1, 3, 4],[2]) - CombinatoricsVector=([CombinatoricsVector=([1, 3, 4], size=3), CombinatoricsVector=([2], size=1)], size=2)
([1, 2],[3, 4]) - CombinatoricsVector=([CombinatoricsVector=([1, 2], size=2), CombinatoricsVector=([3, 4], size=2)], size=2)
([3, 4],[1, 2]) - CombinatoricsVector=([CombinatoricsVector=([3, 4], size=2), CombinatoricsVector=([1, 2], size=2)], size=2)
([3],[1, 2, 4]) - CombinatoricsVector=([CombinatoricsVector=([3], size=1), CombinatoricsVector=([1, 2, 4], size=3)], size=2)
([1, 2, 4],[3]) - CombinatoricsVector=([CombinatoricsVector=([1, 2, 4], size=3), CombinatoricsVector=([3], size=1)], size=2)
([1, 3],[2, 4]) - CombinatoricsVector=([CombinatoricsVector=([1, 3], size=2), CombinatoricsVector=([2, 4], size=2)], size=2)
([2, 4],[1, 3]) - CombinatoricsVector=([CombinatoricsVector=([2, 4], size=2), CombinatoricsVector=([1, 3], size=2)], size=2)
([2, 3],[1, 4]) - CombinatoricsVector=([CombinatoricsVector=([2, 3], size=2), CombinatoricsVector=([1, 4], size=2)], size=2)
([1, 4],[2, 3]) - CombinatoricsVector=([CombinatoricsVector=([1, 4], size=2), CombinatoricsVector=([2, 3], size=2)], size=2)
([1, 2, 3],[4]) - CombinatoricsVector=([CombinatoricsVector=([1, 2, 3], size=3), CombinatoricsVector=([4], size=1)], size=2)
([4],[1, 2, 3]) - CombinatoricsVector=([CombinatoricsVector=([4], size=1), CombinatoricsVector=([1, 2, 3], size=3)], size=2)我想这就是你要找的。不过,它需要进行一些调整(可能需要排序和添加初始列表元素,如[1],[2],[3],[4])。
发布于 2015-06-22 22:55:17
这个问题可以用动态规划来解决,你可以把一个复杂的问题分解成子集。
我认为这篇文章可能有用:数集组合
https://stackoverflow.com/questions/30990851
复制相似问题