01
水滚动数组
#include <bits/stdc++.h>
#define mod 1000007
using namespace std;
int v, n, c;
int k[100101];//体积
int m[101010];//体力
int dp[101010];//算的体积
int main() {
cin >> v >> n >> c;
for (int i = 1; i <= n; i++) {
cin >> k[i] >> m[i];
}
for (int i = 1; i <= n; i++) {
for (int j = c; j >= m[i]; j--) {
if (c - m[i] >= 0)
dp[j] = max(dp[j], dp[j - m[i]] + k[i]);
}
}
int minx = c + 1;
for (int i = 1; i <= c; i++) {
if (dp[i] >= v) {
minx = i;
break;
}
}
if (minx == c + 1)
cout << "Impossible";
else
cout << c - minx;
}