package main import ( "fmt" ) const Mod = 1e9+7 func main() { a := 0 b := 0 for { n, _ := fmt.Scan(&a, &b) if n == 0 { break } else { coins := make([]int, a) for i:=0; i<a; i++ { fmt.Scan(&coins[i]) } fmt.Printf("%d\n", process(coins, b, 0)) } } } func process(coins []int, aim int, index int) int { if len(coins) == 0 || aim < 0{ return 0 } dp := make([][]int, len(coins)+1) for i:=0; i<len(dp); i++ { dp[i] = make([]int, aim+1) dp[i][0] = 1 } dp[len(coins)][0] = 1 for i:=len(dp)-2; i>=0; i-- { for j:=1; j<=aim; j++ { // for k:=0; k*coins[i] <= j; k++ { // dp[i][j] += dp[i+1][j-k*coins[i]] // dp[i][j] = dp[i][j]%Mod // } // 枚举行为可以进一步优化 // eg 假设某个位置dp[i][j],需要依次枚举 0-k次 // dp[i][j] k = 0时,依赖 dp[i+1][j] 处的值 // dp[i][j] k > 0时, 可以认为只依赖 dp[i][j-coins[i]] 处的值(前提不越界 dp[i][j] = (dp[i+1][j]) if j>=coins[i] { dp[i][j] += (dp[i][j-coins[i]]) } dp[i][j] = dp[i][j]%Mod } } return dp[0][aim] }