mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-01 03:24:24 +08:00 
			
		
		
		
	 3f4220de81
			
		
	
	3f4220de81
	
	
	
		
			
			* preorder, inorder, postorder -> pre-order, in-order, post-order * Bug fixes * Bug fixes * Update what_is_dsa.md * Sync zh and zh-hant versions * Sync zh and zh-hant versions. * Update performance_evaluation.md and time_complexity.md * Add @khoaxuantu to the landing page. * Sync zh and zh-hant versions * Add @ khoaxuantu to the landing page of zh-hant and en versions.
		
			
				
	
	
		
			52 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| =begin
 | |
| File: fractional_knapsack.rb
 | |
| Created Time: 2024-05-07
 | |
| Author: Xuan Khoa Tu Nguyen (ngxktuzkai2000@gmail.com)
 | |
| =end
 | |
| 
 | |
| ### 物品 ###
 | |
| class Item
 | |
|   attr_accessor :w # 物品重量
 | |
|   attr_accessor :v # 物品價值
 | |
| 
 | |
|   def initialize(w, v)
 | |
|     @w = w
 | |
|     @v = v
 | |
|   end
 | |
| end
 | |
| 
 | |
| ### 分數背包:貪婪 ###
 | |
| def fractional_knapsack(wgt, val, cap)
 | |
|   # 建立物品串列,包含兩個屬性:重量,價值
 | |
|   items = wgt.each_with_index.map { |w, i| Item.new(w, val[i]) }
 | |
|   # 按照單位價值 item.v / item.w 從高到低進行排序
 | |
|   items.sort! { |a, b| (b.v.to_f / b.w) <=> (a.v.to_f / a.w) }
 | |
|   # 迴圈貪婪選擇
 | |
|   res = 0
 | |
|   for item in items
 | |
|     if item.w <= cap
 | |
|       # 若剩餘容量充足,則將當前物品整個裝進背包
 | |
|       res += item.v
 | |
|       cap -= item.w
 | |
|     else
 | |
|       # 若剩餘容量不足,則將當前物品的一部分裝進背包
 | |
|       res += (item.v.to_f / item.w) * cap
 | |
|       # 已無剩餘容量,因此跳出迴圈
 | |
|       break
 | |
|     end
 | |
|   end
 | |
|   res
 | |
| end
 | |
| 
 | |
| ### Driver Code ###
 | |
| if __FILE__ == $0
 | |
|   wgt = [10, 20, 30, 40, 50]
 | |
|   val = [50, 120, 150, 210, 240]
 | |
|   cap = 50
 | |
|   n = wgt.length
 | |
| 
 | |
|   # 貪婪演算法
 | |
|   res = fractional_knapsack(wgt, val, cap)
 | |
|   puts "不超過背包容量的最大物品價值為 #{res}"
 | |
| end
 |