#include <iostream>#include <algorithm>using namespace std;const int MAXN = 1000 + 5;const int MOD = 1e9 + 7;const int INF = 0x3f3f3f3f;int dp1[MAXN], dp2[MAXN];// 求方案,感觉可以扩展到其他背包问题求方案数// 两个点,初始化为 dp1 除 0 其他初始化为 INF,让状态只能由 0 转移过去,使得体积刚好为 v 时,最大价值是多少// dp2[0] 初始化为 1,转移的时候注意下// 算完以后,可能有多个体积的最大价值都是 最大价值,方案数需要再统计一下int main() { int N, V; cin >> N >> V; dp2[0] = 1; dp1[0] = 0; for (int i = 1; i <= V; i++) dp1[i] = -INF; int v, w; for (int i = 0; i < N; i++) { cin >> v >> w; for (int j = V; j >= v; j--) { int t = max(dp1[j], dp1[j - v] + w); int s = 0; if (t == dp1[j]) s = dp2[j] % MOD; if (t == dp1[j - v] + w) s = (s + dp2[j - v]) % MOD; dp1[j] = t; dp2[j] = s; } } int idx = max_element(dp1, dp1 + V + 1) - dp1; int res = 0; for (int i = 0; i <= V; i++) if (dp1[i] == dp1[idx]) res = (res + dp2[i]) % MOD; cout << res << endl;}