滚动数组滚过。
贴代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int dp[31],p[1001],w[1001]; 5 int main() 6 { 7 int ncase; 8 cin>>ncase; 9 while(ncase--) 10 { 11 int N,G,i,j,temp,total = 0; 12 cin>>N; 13 for(i = 1;i <= N;i++) 14 cin>>p[i]>>w[i]; 15 cin>>G; 16 while(G--) 17 { 18 memset(dp,0,sizeof(dp)); 19 cin>>temp;//temp表示这个人能够承受的最大重量 20 for(i = 1;i <= N;i++) 21 for(j = temp;j >= 1;j--) 22 if(j >= w[i] && dp[j - w[i]] + p[i] > dp[j]) 23 dp[j] = dp[j - w[i]] + p[i]; 24 total += dp[temp]; 25 } 26 cout<<total<<endl; 27 } 28 return 0; 29 }