E - Knapsack 2 題解(超大01揹包)
阿新 • • 發佈:2020-11-13
題目連結
題目大意
給你一n(n<=100)個物品,物品價值最大為1e3,物品體積最多為1e9,揹包最大為1e9
題目思路
如果按照平常的揹包來算那麼時間複雜度直接O(1e11)
這個你觀察就發現其實最大的價值沒超過1e5
那麼你可以改變你的dp方程來求解
設dp[i]表示獲得價值i的最小物品體積即可
程式碼
#include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<vector> #include<string> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #define fi first #define se second #define debug printf(" I am here\n"); using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; const ll INF=0x3f3f3f3f3f3f3f3f; const int maxn=1e5+500,inf=0x3f3f3f3f,mod=1e9+7; const double eps=1e-10; int n,sum; int w[maxn],v[maxn]; ll dp[maxn]; signed main(){ scanf("%d%d",&n,&sum); for(int i=1;i<=n;i++){ scanf("%d%d",&w[i],&v[i]); } memset(dp,0x3f,sizeof(dp)); dp[0]=0; for(int i=1;i<=n;i++){ for(int j=1e5;j>=v[i];j--){ dp[j]=min(dp[j],dp[j-v[i]]+w[i]); } } for(int i=1e5;i>=0;i--){ if(dp[i]<=sum){ printf("%d\n",i); break; } } return 0; }