DFS
一条路走到黑
一、求和
1、题目描述
题目链接
2、题目分析
这是一个典型的DFS的题目
- 数字在一种组合中不能重复使用
- 一种组合之中数字是递增的
- 组合与组合之间按字典序排序
n 是 5
m 是 5
1 、2、3、4、5中任取几个数,加和是 5
3、代码
- 使用一个
List<List<Integer>> lists
保存所有的组合- 使用
List<Integer> list
保存当前 所加 的数字,result表示当前的和,value表示当前的数字,- 在当前value的基础上,for循环遍历其后的 数字(value + 1, value + 2…) ;对每一个 新的value 进行DFS,DFS结束后,注意删除 list 中的上次添加的这个 新的value
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
int n = scanner.nextInt();
int m = scanner.nextInt();
// 存放所有的组合
List<List<Integer>> lists = new ArrayList<>();
// 一种组合
List<Integer> alist = new ArrayList<>();
DFS43(lists, alist, 0, n, m, 0);
for (List<Integer> list : lists) {
for (int value : list) {
System.out.print(value + " ");
}
System.out.println();
}
}
}
public static void DFS(List<List<Integer>> lists, List<Integer> list, int result, int n, int m, int value) {
// 如果当前的 和 > m,回溯
if (result > m) {
return;
}
// 如果当前的 和 == m,新建一个list添加到 lists中,不可添加原有的list
if (result == m) {
lists.add(new ArrayList<>(list));
return;
}
// 继续往后加
for (int i = value + 1; i <= n; i++) {
// 添加 一个新的数字
list.add(i);
DFS(lists, list, result + i, n, m, i);
// 删除 这个数字,加下一个数字
list.remove(list.size() - 1);
}
}
二、幸运袋子
1、题目描述
题目链接
2、题目分析加解决
- 题目意思就是任取带号码的小球,组成幸运袋子(和 > 积),求一共有几种幸运袋子
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = scanner.nextInt();
}
// 排序
Arrays.sort(a);
System.out.println(getCount(a, n, 0, 0, 1));
}
public static int getCount(int[] a, int n, int pos, int sum, int mul){
int count = 0;
for (int i = pos; i < n; i++) {
int newSum = sum + a[i];
int newMul = mul * a[i];
if(newSum > newMul){
count = count + 1 + getCount(a, n,i + 1, newSum, newMul);
} else if(a[i] == 1){
count = count + getCount(a, n, i + 1, newSum, newMul);
} else {
break;
}
while(i < n - 1 && a[i] == a[i + 1]){
i++;
}
}
return count;
}
- 如果是从一个包含所有小球的袋子中,往外拿出小球,判断袋子中剩余的小球能否组成幸运袋子,看看一共有多少种幸运袋子
无法剪枝,时间复杂度过高,测试不通过
public static void main2(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] array = new int[n];
int sum = 0;
int mul = 1;
for (int i = 0; i < n; i++) {
array[i] = scanner.nextInt();
sum += array[i];
mul *= array[i];
}
Arrays.sort(array)
int num = DFS(array, n, 0, sum, mul);
if(sum > mul){
num++;
}
System.out.println(num);
}
public static int DFS(int[] array, int n, int pos, int sum, int mul){
int count = 0;
for (int i = pos; i < n; i++) {
int newSum = sum - array[i];
int newMul = mul / array[i];
if(newSum > newMul){
count++;
}
count = count + DFS(array, n, i + 1, newSum, newMul);
while(i < n - 1 && array[i] == (array[i + 1])){
i++;
}
}
return count;
}
仙境海岸·鲜美烟台
山东烟台