1.并查集
private static int find(int p)
{
if(parent[p] == p)
return p;
else
parent[p] = find(parent[p]);
return parent[p];
}
private static void union(int x, int y){
int px = find(x);
int py = find(y);
if(px != py){
if(px < py)
parent[px] = py;
else
parent[py] = px;
}
}
2.笛卡尔积
@SuppressWarnings({ "rawtypes", "unchecked" })
public static ArrayList Dikaerji0(ArrayList al0) {
ArrayList a0 = (ArrayList) al0.get(0);// l1
ArrayList result = new ArrayList();// 组合的结果
for (int i = 1; i < al0.size(); i++) {
ArrayList a1 = (ArrayList) al0.get(i);
ArrayList temp = new ArrayList();
// 每次先计算两个集合的笛卡尔积,然后用其结果再与下一个计算
for (int j = 0; j < a0.size(); j++) {
for (int k = 0; k < a1.size(); k++) {
ArrayList cut = new ArrayList();
if (a0.get(j) instanceof ArrayList) {
cut.addAll((ArrayList) a0.get(j));
} else {
cut.add(a0.get(j));
}
if (a1.get(k) instanceof ArrayList) {
cut.addAll((ArrayList) a1.get(k));
} else {
cut.add(a1.get(k));
}
temp.add(cut);
}
}
a0 = temp;
if (i == al0.size() - 1) {
result = temp;
}
}
return result;
}
3、背包
private static void printGood(){
int temp = 5000;
for(int i = 14; i > 0; i--){
if(packageBag(i, temp) - packageBag(i-1, temp - good[i]) == good[i]){
System.out.print(" " + (i+1));
temp = temp - good[i];
}
}
}
private static int packageBag(int i, int lastRoom){
if(i == 0){
return lastRoom >= good[i] ? good[i] : 0;
}
int put = 0;
if(lastRoom >= good[i]){
put = good[i] + packageBag(i-1, lastRoom - good[i]);
}
int noPut = packageBag(i-1,lastRoom);
return Math.max(put, noPut);
}