将一堆正整数分为2组,要求2组的和相差最小。



例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。



Input



第1行:一个数N,N为正整数的数量。 第2 - N+1行,N个正整数。 (N <= 100, 所有正整数的和 <= 10000)



Output



输出这个最小差



Input示例



5 1 2 3 4 5



Output示例



1




虽然这是一道简单的01背包问题,但我还是要写,因为我花了4个小时去用另一个dp来写。

我的做法是dp[i]是代表一边存i个数的时候差值最小,然后用A,B来存两边的总和..

然后写蒙了,多组数据的样例过不了。

最后把他转化成01背吧,就是拿出的数最接近sum/2...就行了..行了...了...

代码如下:


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 10000
int a[N],dp[N],vis[N],A,B;
int main(){
int i,j,n,m,k;
scanf("%d",&n);
int sum=0;
for(i=1;i<=n;i++)
{scanf("%d",&a[i]);
sum+=a[i];}
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
sort(a+1,a+1+n);
dp[1]=abs(2*a[n]-sum);
memset(vis,0,sizeof(vis));
vis[n]=1;
A=a[n];
B=sum-a[n];
for(i=2;i<=n/2;i++){
dp[i]=dp[i-1];
k=0;
for(j=1;j<=n;j++){
if(!vis[j]&&abs(A-B+2*a[j])<dp[i]){
dp[i]=abs(A-B+2*a[j]);
k=j;
}
}
if(k!=0){
vis[k]=1;
B-=a[k];
A+=a[k];}
}
sort(dp+1,dp+1+n/2);
cout<<dp[1]<<endl;
return 0;
}