典型的01背包 DP方程: dp[i][j]=max(dp[i-1][j],dp[i-1][j-volume[i]]+value[i]); #include<iostream> #include<stdio.h> #include<string.h> #include<string> using namespace std; int T; int N,V; int value[1005]; int volume[1005]; int dp[1005]; int main() { scanf("%d",&T); while(T--) { memset(dp,0,sizeof(dp)); scanf("%d%d",&N,&V); //录入价值 for(int i=1;i<=N;++i) scanf("%d",&value[i]); //录入体积 for(int i=1;i<=N;++i) scanf("%d",&volume[i]); //DP for(int i=1;i<=N;++i) for(int j=V;j>=volume[i];--j) dp[j]=max(dp[j],dp[j-volume[i]]+value[i]); printf("%d/n",dp[V]); } return 0; }