题意:把n个数字分两组,求最小差值。
01背包,求出dp[ave]
,这就是第一组最接近ave的和,然后用sum-2*dp[ave]即可。(记得abs 不能出现负数)
#include<bits/stdc++.h>
using namespace std;
int dp[100005];
int a[100005];
int sum = 0;
int main(){
int n,m;
while(~scanf("%d",&n)){
for(int i = 0;i<n;i++){
scanf("%d",&a[i]);
sum+=a[i];
}
int ave = sum/2;
for(int i = 0;i<n;i++){
for(int j = ave;j>=a[i];j--){
dp[j] = max(dp[j],dp[j-a[i]]+a[i]);
}
}
int num = sum-dp[ave];
cout<<abs(num-dp[ave])<<endl;
}
}