题解:本题主要考查01背包,本题是01背包的变形,不是求最大的而是到某一体积,大于等于应填体积时,输出剩余体力减耗费体力即可,如果最后都达不到,出"Impossible"
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int w[2000000],v[2000000],m[20000000];
int main()
{
int n,total,sum;
cin>>total>>n>>sum;
for(int i=1;i<=n;i++)
cin>>m[i]>>v[i];
for(int i=1;i<=n;i++)
{
for(int j=sum;j>=v[i];j--)
{
w[j]=max(w[j],w[j-v[i]]+m[i]);
}
}
for(int i=1;i<=sum;i++)
{
if(w[i]>=total)
{
cout<<sum-i;
return 0;
}
}
cout<<"Impossible";
return 0;
}