dp[i][j]:从前i个物品选出总重量不超过j的总价值的最大值。初始化为0。
状态转移方程:dp[i+1][j]=max(dp[i][j]+dp[i][j-w[i]]+va[i]);
意思就是不选i和选i物品后的最大值。
#include<bits/stdc++.h> 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() 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; int dp[1005][1005]={0}; int main() { int T; cin>>T; while(T--) { int n,v,i; int w[1005],va[1005]; sdd(n,v); fu0(i,n) sd(va[i]); fu0(i,n) sd(w[i]); for(i=0;i<=n;i++) { for(int j=0;j<=v;j++) { if(j<w[i]) dp[i+1][j]=dp[i][j]; else dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+va[i]); } } cout<<dp[n][v]<<endl; } return 0; }