[COCI 2009-2010 #6] XOR
阿新 • • 發佈:2021-08-06
貪心演算法指的是,在對問題求解時,總是做出當前看來最好的選擇。也就是說,不從整體最優上加以考慮,所做出的是某種意義上的區域性最優解。
注意:貪心演算法並不保證會得到最優解,但是在某種問題上貪心演算法就是最優解。
一、揹包問題
問題可以描述為:給定一組物品,每種物品都有自己的重量w和價格v,在限定的總重量W內,我們如何選擇,才能使得物品的總價格最高。
1. 0-1揹包,對於一個物品,要麼完整取走,要麼留下。既不能取走多次,也不能只拿走一部分。
2. 分數揹包,對於一個物品,可以取走其中任意一部分。
舉例:
商品1: v=60, w=10
商品1: v=100, w=20
商品1: v=120, w=30
揹包容量:W=50
goods = [(60, 10), (100, 20), (120, 30)] def fractional_backpack(goods, w): # mindex指示取第幾個,值表示取幾個 m = [0 for _ in range(len(goods))] total_v = 0 goods.sort(key=lambda x: x[0]/x[1], reverse=True) for i, (price, weight) in enumerate(goods): if w >= weight: m[i] = 1 total_v += price w -= weight else: m[i] = w / weight total_v += m[i]*price w = 0 return m, total_v print(fractional_backpack(goods, 50))
二、拼接最大數字問題
有n個非負整數,將其按照字串拼接的方式拼接成一個整數。如何拼接可以使整數最大。
例子:32,94,128,1286,6, 71可以拼接的最大整數是 94716321286128
from functools import cmp_to_key num_list = [32, 94, 128, 1286, 6, 71] def xy_cmp(x, y): if x+y < y+x: return 1 elif x+y > y+x: return -1 else: return 0 def num_join(li): li = list(map(str, li)) li.sort(key=cmp_to_key(xy_cmp)) return ''.join(li) print(num_join(num_list))