01背包的微微变型
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10, M = 1e4 + 10;
int n,m,c;
int v[N],e[N];
int f[M],a[N];
int res;
int main(){
scanf("%d%d%d",&res,&n,&c);
for(int i =1; i<= n; i++){
scanf("%d%d",&v[i],&e[i]);
}
for(int i = 1; i <= n; i++){
for(int j = c; j >= e[i]; j--){
f[j] = max(f[j], f[j - e[i]] + v[i]) ;
}
}
if(f[c] >= res){
int i = c;//精卫的体力
while(f[i] >= res) i--;//当f[i]的体积大于等于要求的res的体积时,i:体力值减一
//直到在体力值为i的情况下的总体积f[i]恰好小于res,此时,体力值i加1,恰好就是花费最小的体力所填的总体积大于等于res.
printf("%d\n",c - (i + 1));
}
else{
puts("Impossible");
}
return 0;
}