mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-04 22:28:40 +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
 | 
						|
}
 |