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))