一共三道编程题,然后只做出了第一道,后面的两个,, 额,没有时间做了,讲道理第一道题这么简单,不应该花了时间的。
说说第三道题:就是一个数组arr[] = {1, 5, 6, 1 , 2},将它分成两组,然后要求,两组序列的F值和最小,F值就是数组相邻元素值的绝对值差值最小。
解答:
最容易想到的回溯法:这篇博文,也是回忆一下回溯法的两种
constraint(t):限界条件 bound(t):边界条件
回溯法:子集树:
public void backtrack(int t){
if( t > n){
output(x);
}else{
for (int i = 0; i<=1; i++){
x[t] = i;
if (constraint(t) && bound(t)){
backtrack(t + 1);
}
}
}
排列数:
public void backtrack(int t){
if (t > n)
output(x);
else {
for (int i =t; i <=n; i++){
swap(x[t], x[i]);
if (constraint(t) && bound(t))
backtrack(t + 1);
swap(x[t],x[i]);
}
}
}