python-----贪心算法

it2022-05-05  160

01贪心算法

在对问题求解时,总是作出在当前看来是最好的选择。也就是说,不从整体上加以考虑, 它所作出的仅仅是在某种意义上的局部最优解(是否是全局最优,需要证明)。

02最优装载问题

课上例题:有一天海盗们截获了一艘装满各种各样古董的货船,每一件都价值连城,一旦打碎就是去了价值, 海盗船载重量为C,每件固定的重量为wi,海盗们该如何尽可能装载最多数量的古董呢?

古董重量清单:

1. 船载重量固定为C,只要每次选择重量最小的古董,直到不能再装为止,这样装载的古董数量最大,     这就是贪心策略;

2. 把古董按重量从小到大排序,根据策略选出尽可能多的古董。

最优装载问题代码运行如下:

#定义每个古董的重量 def max_ans(antique,c): anti_sort = sorted(antique) ans, temp= 0,0 ship = [] for i in anti_sort: temp +=i if temp <c: ans += 1 ship.append(i) print("装载古董数量:",ans) print("装载的古董:",ship) if __name__ == '__main__': antique = [4,10,7,11,3,5,14,2] max_ans(antique,40)

代码运行结果如下:

02背包问题

例题:

假设山洞中有n种宝物,每种宝物有一定重量w和相应的价值v,毛驴运载能力 一种宝物只能拿一样,宝物可分割。怎样才能使毛驴运走宝物的价值最大呢?

背包问题算法设计步骤:

1. 计算出每件宝物的性价比,按照从高到低排序;

2. 根据贪心策略,按性价比从大到小选取宝物,直到达到毛驴的运载能力。每次选择宝物后判断是否 小于m,如果不小于则取走宝物的一部分,程序结束。

背包问题代码运行如下:

datas = [ [4,3],[2,8],[9,18],[5,6], [5,8],[8,20],[5,5],[4,6], [5,7],[5,15] ] m=30#毛驴的运载能力 w= 0#获取的总价值 for i in range(len(datas)): price = datas[i][1] / datas[i][0] datas[i].append(price) datas.sort(key=lambda data:data[2],reverse=True) for data in datas: if data[0] <=m: w+= data[1] m -=data[0] else: w+= data[2]*m print("总价值:",w)

运行结果如下所示:

 

 


最新回复(0)