1. #include <iostream>
    2. #include <algorithm>
    3. using namespace std;
    4. const int MAXN = 1000 + 5;
    5. const int MOD = 1e9 + 7;
    6. const int INF = 0x3f3f3f3f;
    7. int dp1[MAXN], dp2[MAXN];
    8. // 求方案,感觉可以扩展到其他背包问题求方案数
    9. // 两个点,初始化为 dp1 除 0 其他初始化为 INF,让状态只能由 0 转移过去,使得体积刚好为 v 时,最大价值是多少
    10. // dp2[0] 初始化为 1,转移的时候注意下
    11. // 算完以后,可能有多个体积的最大价值都是 最大价值,方案数需要再统计一下
    12. int main() {
    13. int N, V;
    14. cin >> N >> V;
    15. dp2[0] = 1;
    16. dp1[0] = 0;
    17. for (int i = 1; i <= V; i++) dp1[i] = -INF;
    18. int v, w;
    19. for (int i = 0; i < N; i++) {
    20. cin >> v >> w;
    21. for (int j = V; j >= v; j--) {
    22. int t = max(dp1[j], dp1[j - v] + w);
    23. int s = 0;
    24. if (t == dp1[j]) s = dp2[j] % MOD;
    25. if (t == dp1[j - v] + w) s = (s + dp2[j - v]) % MOD;
    26. dp1[j] = t;
    27. dp2[j] = s;
    28. }
    29. }
    30. int idx = max_element(dp1, dp1 + V + 1) - dp1;
    31. int res = 0;
    32. for (int i = 0; i <= V; i++) if (dp1[i] == dp1[idx]) res = (res + dp2[i]) % MOD;
    33. cout << res << endl;
    34. }