#include <bits/stdc++.h>
using namespace std;
int n[4],m[20],o=0,dp[2501];
string s;
char a;
int main()
{
cin>>n[0]>>n[1]>>n[2]>>n[3];
for(int i=0;i<4;i++){
int z=0;
for(int j=0;j<n[i];j++){
cin>>m[j];z+=m[j];
}
for(int j=0;j<n[i];j++){
for(int k=z/2;k>=m[j];k--){
dp[k]=max(dp[k-m[j]]+m[j],dp[k]);
}
}
o+=z-dp[z/2];
for(int j=1;j<=z/2;j++)
dp[j]=0;
}
cout<<o;
return 0;
}
就是一个简单的背包,,没什么好看的
(这一题是用来解决一堆数据怎么样才能分成两份和最接近的,,,就相当于找哪几个装背包里能装的最满)
还是复习一下,背包适合求空间量的问题,也可以求最接近一个值的和,把value,空间
什么的当成1就可以了
1287

被折叠的 条评论
为什么被折叠?



