算法练习——最大分解、车的放置
这是蓝桥杯算法训练的两个题目,采用的是搜索算法,需要使用递归思想
一、车的放置
在一个n*n的棋盘中,每个格子中至多放置一个车,且要保证任何两个车都不能相互攻击,有多少中放法(车与车之间是没有差别的)
package algorithm; import java.util.Scanner; //车的放置 public class lianxi10 { static int count = 1;//默认一种 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] flag = new int[n];//nxn矩阵 dfs(0, flag); System.out.println(count); } static void dfs(int line, int[] flag) {
//判断是否为n*n矩阵 if (line > flag.length - 1) {//如果line(代表放下个数)如果超过则直接返回 return; } for (int i = 0; i < flag.length; i++) { if (flag[i] == 0) { flag[i] = 1; count++; //搜索下一位置 dfs(line + 1, flag); //回溯 flag[i] = 0; } } dfs(line + 1, flag); } }
二、最大分解
给出一个正整数n,求一个和最大的序列a0,a1,a2,……,ap,满足n=a0>a1>a2>……>ap且ai+1是ai的约数,输出a1+a2+……+ap的最大值
这里的ai+1是ai的约数=>a(i+1)是ai的约束
package algorithm; import java.util.*; //最大分解 public class lianxi11 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); HashSet<Integer> hash = new HashSet<Integer>(); hash = dfs(n, hash); int result = 0; for (Integer list : hash) { result += list; } System.out.println(result); } public static HashSet<Integer> dfs(int n, HashSet<Integer> hash) { for (int i = n - 1; i > 0; i--) { if (n % i == 0) {// a(i+1)是ai的约数,ai是n的约数 n = i;// 对n重新赋值 hash.add(n);// 将n进行存储 dfs(n, hash);//这里不需要赋值n-1,因为已经对n进行重新赋值 } } return hash; } }