普通的01背包问题
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 10005;
int dp[MAXN], v1[MAXN], weight[MAXN], v, n, c, sum, flag;
int main()
{
cin >> v >> n >> c;
for(int i = 1; i <= n; i++)
{
cin >> weight[i] >> v1[i];
sum += weight[i];
}
if(sum < v)
{
cout << "Impossible";
return 0;
}
for(int i = 1; i <= n; i++)
for(int j = c; j >= v1[i]; j--)
{
dp[j] = max(dp[j], dp[j-v1[i]]+weight[i]);//搜索体力最少为多少时可以填完海,并记录最少的体力
}
for(int i = 1; i <= MAXN; i++)
if(dp[i] >= v) flag = 1;
if(flag)
{
for(int i = 1; i <= MAXN; i++) //从小到大枚举体力
{
if(dp[i] >= v)//若此时用的体积已符合要求
{
int a = c-i;//剩余体力
if(a < 0)//若此时剩余体力都小于零,说明后面要用更大的体力才能满足体积。所以直接就不用看后面的了,肯定不符合。
{
cout << "Impossible";
return 0;
}
else { //若此时体力大于零,说明此时用的体积最小,剩余体积最大。直接输出。
cout << a;
return 0;
}
}
}
}
else {
cout << "Impossible";
return 0;
}
}