#include using namespace std; const int N = 2010; int v[N], w[N]; int n, L; int ans = INT_MAX; int memo[N][N]; // memo[u][m] 表示处理到第u个物品时,容量m的最小花费 void dfs(int u, int c, int m) { // 剪枝:当前花费已超过已知最优解 if (c >= ans) return; // 统一处理容量达标的情况 m = min(m, L); // 状态压缩 if (m >= L) { ans = min(ans, c); // 记录可行的解 return; } // 记忆化剪枝 if (memo[u][m] != -1 && c >= memo[u][m]) return; memo[u][m] = c; // 递归终止条件 if (u > n) return; // 选当前物品 dfs(u + 1, c + v[u], m + w[u]); // 不选当前物品 dfs(u + 1, c, m); } int main() { cin >> n >> L; for (int i = 1; i <= n; i++) cin >> v[i] >> w[i]; memset(memo, -1, sizeof memo); dfs(1, 0, 0); cout << (ans < INT_MAX ? to_string(ans) : "no solution") << endl; return 0; }