算法练习——最大分解、车的放置

这是蓝桥杯算法训练的两个题目,采用的是搜索算法,需要使用递归思想

一、车的放置

在一个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;
    }
}

 

posted on 2022-04-07 14:09  跨越&尘世  阅读(92)  评论(0编辑  收藏  举报