算法机考学习

1.刷题网站

1.力 扣 ——https://leetcode-cn.com/problemset/all
2.牛客在线编程算法篇——https://www.nowcoder.com/exam/oj
3.剑指offer——https://www.nowcoder.com/ta/coding-interviews?page=1

2.题型

2.1.回溯算法

这里是引用回溯算法是一种通用的求解问题的算法。该算法通过对问题的搜索树进行深度优先搜索来解决问题。回溯算法的思想是,在当前的搜索路径上尝试所有可能的选择,并在遇到不符合题意的情况时回溯(即返回到上一步并选择另一种可能的选择)。回溯算法经常用于解决组合问题、生成所有可能的排列或组合等等。
回溯算法通常涉及三个步骤:
1.在当前的搜索路径上按顺序选择所有可能的选择。
2.在每一步选择后,对当前状态进行评估,以确定是否符合题意。
3.如果当前状态不符合题意,回溯(即返回到上一步并选择另一种可能的选择),否则如果所有的选择都已经被评估过,算法结束。

问题:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

#1.回溯算法解决八皇后问题(套娃)
def solution(n):
    positions=[-1]*n#8个行分别都是第几列有皇后这个状态
    #1.首先在这一行中这一列是否可以放皇后
    def could_place_c(row,col):
        for i in range(row):
            if positions[i]==col or abs(positions[i]-col)==abs(i-row):#不同行的两个皇后不能处于同一列,或者,不能处于一条线上
                return False
        return True#这一行的这一列可以放皇后
    def backtrack(row=0,count=0):#从第0行开始
        if row == n:#如果跑完了8行,
            count+=1
            return count
        for col in range(n):
            if could_place_c(row,col):#如果这一行的这一列可以放
                positions[row]=col
                count= backtrack(row+1,count)
        return count
    return backtrack()
print("8*8的皇后棋盘的解决方案有%d种" %(solution(8)))#92种

2.2.贪心算法

假设有一个背包,容量为 W,有 n 个物品,每个物品都有一个重量和价值。现在的目标是选择尽可能多的物品,使得这些物品的总重量不超过背包容量,并且总价值最大。
贪心算法的做法是:
1.首先对物品进行排序,按照每个物品的单位价值(价值除以重量)排序;
2.按照单位价值从大到小的顺序选择物品,直到背包容量不能再容纳下一个物品为止;
3.对于无法完全放入背包的物品,按照需要的量分配给背包的剩余空间。
通过这样的贪心算法,我们可以获得比较优秀的解,但不一定是最优解。

#1.贪心算法解决背包问题
import math
items=[(2,10,60),(3,20,100),(4,30,120)]#物品信息(个数,重量,价值)
max_weight=50#背包可放50重量的物品
def knapsack(items,max_weight):
    items=sorted(items,key=lambda x:x[2]/x[1],reverse=True)#价值/重量》单位重量的价值
    total_value,total_weight=0,0
    for item in items:
        if total_weight+item[1]*item[0]<=max_weight and item[0]>0:
            total_weight+=item[1]*item[0]
            total_value+=item[2]*item[0]
        else:
            fraction_L=math.modf((max_weight-total_weight)/item[1])[1]#剩余空可以放几个,小数取整数值
            print(fraction_L)
            total_weight+=item[1]*fraction_L
            total_value+=item[2]*fraction_L
            break
    return total_weight,total_value
tw,tv=knapsack(items,max_weight)
print("total_weight=%d,total_value=%d"%(tw,tv))

3.注意事项

猜你喜欢

转载自blog.csdn.net/weixin_38226321/article/details/128878624