题解,求关注
2024-06-30 13:03:40
发布于:浙江
4阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10005;
int V,n,c;
int ans;
int v[MAXN],w[MAXN];
int dp[MAXN];
int main()
{
cin>>V>>n>>c;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>w[i];
ans+=v[i];//先用ans去存储所有石头的总体积
}
if(ans<V)//特判一下如果所有石头的总体积都填不满的情况
{
cout<<"Impossible"<<endl;
return 0;
}
for(int i=1;i<=n;i++)
{
for(int j=c;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
}//1维滚动数组压缩的01背包状态转移
for(int i=0;i<=V;i++)
{
if(dp[i]>=V)
{
cout<<c-i<<endl;
return 0;
}
}//从小到大搜,第一个大于V的直接输出。
cout<<"Impossible"<<endl;//填不满直接输出
return 0;
}
这里空空如也
有帮助,赞一个