题目描述:
现在有n根木棒,每一根都有一个长度和重量,现在有一个木棒的处理机器,小招喵要处理这n根木棒,这个机器的花费如下:处理第一木棒需要花费1,如果处理当前木棒的长度和重量都大于等于上一根木棒的长度和重量,则不需要花费,否则花费1,现在小招喵可以以任意顺序摆这些木棒。问最小花费是多少?
输入:
n
weight [ ]
length [ ]
如:
n = 5;
weight ={4,9,5,2,2};
length = {1,3,5,1,4};
输出:
2
分析
- 所有解的情况是所有木棒的全排列, 这样可以通过深度优先搜索实现。
- 设置一个seq[n] 数组,用于盛放之前设置的木棒次序。
- 设置一个used[n]数组,用于查看是否使用过某一木棒。
- 编写一个递归函数,使用回溯法,对所有情况遍历。
- 如果到叶节点,判断下是否需要更新最小值。
java 代码
public class Solution {
static int mini = 9999;
static int [] weight = {4,9,5,2,2};
static int [] length = {1,3,5,1,4};
static int n = 5;
public static void main(String[] args) {
for(int i = 0; i < n; i++){
//默认false 没有使用
boolean [] used = new boolean[n];
used[i] = true;
int [] seq = new int [n];
//第i木棒位置0已经使用
seq[0] = i;
//从位置1往后寻找
helper( 1, 1, used,seq);
for(int k :seq){
System.out.print(k);
}
System.out.println();
}
System.out.println(mini);
}
public static void helper(int position,int res,boolean [] used,int [] seq){
if(position == n ){
if( res < mini){
mini = res;
}
return ;
}
for(int i = 0; i < n; i++){
//如果i没有使用过
if(!used[i]){
used[i] = true;
//试图在position上放置i
seq[position] = i;
if((weight[i] >= weight[seq[position-1]]) && (length[i] >= length[seq[position-1]])){
helper(position+1,res,used,seq);
}else{
helper(position+1,res+1,used,seq);
}
used[i] = false;
}
}
return ;
}
}