|  | @@ -0,0 +1,40 @@
 | 
	
		
			
				|  |  | +func shoppingOffers(price []int, special [][]int, needs []int) int {
 | 
	
		
			
				|  |  | +	var need [6]int
 | 
	
		
			
				|  |  | +	copy(need[:], needs)
 | 
	
		
			
				|  |  | +	m := make(map[[6]int]int)
 | 
	
		
			
				|  |  | +	return buy(price, special, need, m) // DFS
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func buy(price []int, special [][]int, need [6]int, m map[[6]int]int) int {
 | 
	
		
			
				|  |  | +	if v, ok := m[need]; ok {
 | 
	
		
			
				|  |  | +		return v
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	res := 0
 | 
	
		
			
				|  |  | +	for i := range price {
 | 
	
		
			
				|  |  | +		res += need[i] * price[i]
 | 
	
		
			
				|  |  | +	} // The price without special offer
 | 
	
		
			
				|  |  | +	for _, s := range special {
 | 
	
		
			
				|  |  | +		var n [6]int
 | 
	
		
			
				|  |  | +		copy(n[:], need[:])
 | 
	
		
			
				|  |  | +		i := 0
 | 
	
		
			
				|  |  | +		for ; i < len(price); i++ {
 | 
	
		
			
				|  |  | +			n[i] -= s[i]
 | 
	
		
			
				|  |  | +			if n[i] < 0 {
 | 
	
		
			
				|  |  | +				break
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		if i == len(price) {
 | 
	
		
			
				|  |  | +			res = minInt(res, s[i]+buy(price, special, n, m))
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	m[need] = res
 | 
	
		
			
				|  |  | +	return res
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func minInt(x, y int) int {
 | 
	
		
			
				|  |  | +	if x < y {
 | 
	
		
			
				|  |  | +		return x
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return y
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 |