iT邦幫忙

2023 iThome 鐵人賽

DAY 18
0
Software Development

30天快速打造Python資料結構&演算法邏輯刷爆LeetCode系列 第 18

DAY 18 「貪心算法 分數背包」特殊最優解的Python程式碼撰寫~

  • 分享至 

  • xImage
  •  

特殊背包允許部分選取物品而不必整個選取或放棄

/images/emoticon/emoticon08.gif白話說這種情況就是物品的數量和重量都可以是分數~

解決這種問題的一種方法是使用貪心算法。貪心算法是一種尋找局部最優解的策略,可選擇當前情況下最好的選擇,而不考慮全局最優解。

在分數背包問題中,我們計算每個物品的價值重量比(value/weight),然後按照這個比率將物品排序,從價值重量比最高的物品開始選取,直到背包被裝滿或所有物品都被選取。

這種方法的優點是簡單且效率高,但它並不保證一定能找到全局最優解,僅僅關注當前的局部最優解。

def fractional_knapsack(C, w, v):
    # 計算物品的價值重量比
    value_per_weight = [(v[i] / w[i], w[i], v[i]) for i in range(len(w))]
    
    # 將物品按價值重量比降序排序
    value_per_weight.sort(reverse=True)
    
    total_value = 0
    selected_items = []
    
    for ratio, weight, value in value_per_weight:
        if C >= weight:
            total_value += value
            selected_items.append((weight, value, 1))
            C -= weight
        else:
            fraction = C / weight
            total_value += fraction * value
            selected_items.append((weight, value, fraction))
            break
    
    return total_value, selected_items

# 測試
C = 50
w = [10, 20, 30]
v = [60, 100, 120]

result, items = fractional_knapsack(C, w, v)
print("最大價值為:", result)
print("選擇的物品:")
for item in items:
    print(f"重量: {item[0]}, 價值: {item[1]}, 比例: {item[2]}")
最大價值為: 240.0
選擇的物品:
重量: 30, 價值: 120, 比例: 1
重量: 20, 價值: 100, 比例: 1
重量: 10, 價值: 60, 比例: 1

這表示在背包容量為 50 時,選擇一些物品放入背包可以獲得的最大價值為 240。選擇的物品及其比例也被列出。


上一篇
DAY 17 「貪心算法(Greedy Algorithms)」求解最佳化問題時常用的Python程式碼撰寫~
下一篇
DAY 19 「0/1 背包問題和分數背包問題」傻傻比較Python程式碼撰寫~
系列文
30天快速打造Python資料結構&演算法邏輯刷爆LeetCode30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言