FZU 2214 Knapsack dp (转化背包)
就是一个背包裸题,由于物品的重量太大,开不了这么大的数组
所以转化一下,由于价值总和不大于5000,所以把价值看作重量,重量看作价值,那么就是同样的价值下,求一个最轻的重量
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cstdlib> #include<cmath> #include<cstdlib> #include<vector> #include<queue> using namespace std; typedef long long LL; const int INF=0x3f3f3f3f; const int maxn=5005; LL dp[maxn]; int w[505],v[505]; int main() { int T; scanf("%d",&T); while(T--) { int n,b; scanf("%d%d",&n,&b); memset(dp,INF,sizeof(dp)); int sum=0; for(int i=1;i<=n;++i) scanf("%d%d",&w[i],&v[i]),sum+=v[i]; dp[0]=0; for(int i=1;i<=n;++i) { for(int j=sum;j>=v[i];--j) if(dp[j-v[i]]!=INF) dp[j]=min(dp[j-v[i]]+w[i],dp[j]); } int ans=0; for(int i=sum;i>0;--i) if(dp[i]!=INF&&dp[i]<=b)ans=max(ans,i); printf("%d\n",ans); } return 0; }