package main import ( "fmt" ) func main() { num, target := 0, 0 for { n, _ := fmt.Scan(&num, &target) if n == 0 { break } else { coins := make([]int, num) for i:=0; i<len(coins); i++ { fmt.Scan(&coins[i]) } dp := make([][]int, len(coins)+1) for i:=0; i<len(dp); i++ { dp[i] = make([]int, target+1) if i==len(dp)-1 { for j:=1; j<len(dp[i]); j++ { dp[i][j] = -1 } } } for i:=len(dp)-2; i>=0 ; i-- { for j:=1; j <len(dp[i]); j++ { dp[i][j] = dp[i+1][j] if j>= coins[i] { if dp[i][j-coins[i]] >= 0 { if dp[i][j] == -1 { dp[i][j] = dp[i][j-coins[i]] + 1 } else { dp[i][j] = min(dp[i][j], dp[i][j-coins[i]] + 1) } } } } } fmt.Println(dp[0][target]) } } } // func process(target int, coins []int, i int) int{ // if target == 0 { // return 0 // } // if i == len(coins) { // return -1 // } // sum := target+1 // for k:=0; k*coins[i] <= target; k++ { // sum1 := process(target-k*coins[i], coins , i+1) // if sum1 == -1 { // continue // } // sum = min(sum1+k, sum) // } // if sum == target+1 { // return -1 // } // return sum // } func min(a, b int) int { if a<b { return a } return b }