mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-10-31 18:37:48 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			42 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // File: fractional_knapsack.go
 | |
| // Created Time: 2023-07-23
 | |
| // Author: Reanon (793584285@qq.com)
 | |
| 
 | |
| package chapter_greedy
 | |
| 
 | |
| import "sort"
 | |
| 
 | |
| /* 物品 */
 | |
| type Item struct {
 | |
| 	w int // 物品重量
 | |
| 	v int // 物品价值
 | |
| }
 | |
| 
 | |
| /* 分数背包:贪心 */
 | |
| func fractionalKnapsack(wgt []int, val []int, cap int) float64 {
 | |
| 	// 创建物品列表,包含两个属性:重量、价值
 | |
| 	items := make([]Item, len(wgt))
 | |
| 	for i := 0; i < len(wgt); i++ {
 | |
| 		items[i] = Item{wgt[i], val[i]}
 | |
| 	}
 | |
| 	// 按照单位价值 item.v / item.w 从高到低进行排序
 | |
| 	sort.Slice(items, func(i, j int) bool {
 | |
| 		return float64(items[i].v)/float64(items[i].w) > float64(items[j].v)/float64(items[j].w)
 | |
| 	})
 | |
| 	// 循环贪心选择
 | |
| 	res := 0.0
 | |
| 	for _, item := range items {
 | |
| 		if item.w <= cap {
 | |
| 			// 若剩余容量充足,则将当前物品整个装进背包
 | |
| 			res += float64(item.v)
 | |
| 			cap -= item.w
 | |
| 		} else {
 | |
| 			// 若剩余容量不足,则将当前物品的一部分装进背包
 | |
| 			res += float64(item.v) / float64(item.w) * float64(cap)
 | |
| 			// 已无剩余容量,因此跳出循环
 | |
| 			break
 | |
| 		}
 | |
| 	}
 | |
| 	return res
 | |
| }
 | 
