思路:DP+一维数组(滚动数组)
一般的状态转移方程是:dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]
此题用二维数组会超内存。
如图:
状态转移方程:dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; #define inf 0x3f3f3f3f #define ll long long #define fo freopen("in.txt","r",stdin) #define fc fclose(stdin) #define fu0(i,n) for(i=0;i<n;i++) #define fu1(i,n) for(i=1;i<=n;i++) #define fd0(i,n) for(i=n-1;i>=0;i--) #define fd1(i,n) for(i=n;i>0;i--) #define mst(a,b) memset(a,b,sizeof(a)) #define sd(n) scanf("%d",&n) #define sdd(n,m) scanf("%d %d",&n,&m) #define ss(s) scanf("%s",s) #define sddd(n,m,k) scanf("%d %d %d",&n,&m,&k) #define pans(ans) printf("%d\n",ans) #define all(a) a.begin(),a.end() #define sc(c) scanf("%c",&c) const int maxn=200005; const double eps=1e-8; const double PI = acos(-1.0); int main() { int dp[13000]={0}; int n,m; while(~sdd(n,m)) { int w[3500],v[3500]; int i,j; fu0(i,n) { sdd(w[i],v[i]); } for(i=0;i<n;i++) { for(j=m;j>=w[i];j--) { dp[j]=max(dp[j],dp[j-w[i]]+v[i]); } } cout<<dp[m]<<endl; } return 0; }
我发现图片要先转换成jpg才能上传。。png的不行。。