其实就是把背包容量视为总和除以2的01背包。
因为要让差值小,就是使得一组的和接近s/2.
#include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <cstdlib> using namespace std; const int MAXN =10000+10; const long long INF =1000000007 ; const long long MOD =(1ll<<32); const double EPS=1e-8; const double pi = acos(-1); int a[MAXN]; int dp[MAXN]; int main() { int n; scanf("%d",&n); int s=0; for(int i=0;i<n;i++){ scanf("%d",a+i); s+=a[i]; } int m=s/2; for(int i=0;i<n;i++){ for(int v=m;v>=a[i];v--){ dp[v]=max(dp[v],dp[v-a[i]]+a[i]); } } int res=0; printf("%d\n",s-2*dp[m]); }