一个数字划分成两个之差最小的数组问题

一个数字S={a1,a2,...,an}。

假设划分两个子数组X, Y 是S 的,并且XUY=S。

假设X元素之和为x, y元素之和为y, S元素之和为s。

则x+y=s, 

目标min: y-x(假设y>=x)

y-x=s-x-x=s-2*x

欲使其min, 只需令2*x最大,即在满足2x<=s,也就是x<=s/2的情况下,求最大的x。

这是一个背包问题。

struct T{
int v;
int p;
}
void func(int a[], int n){
s=sumof(a,n);
int i,j;
T c[n+1][s/2+2];
for(i=1;i<=n;i++)
     for(j=1;2*j<=s;j++) {
        if(j>=a[i]&&c[i-1][j-a[i].v]+a[i]>c[i-1][j].v) {
            c[i][j].v=c[i-1]j-a[i]].v;
            c[i][j].p=i;
          } else { c[i][j]=c[i-1][j]; }
    }
i=n;
if(s %2 ) m=s/2;
else m=s/2+1;
while(m>0){
   printf("a[%d]=%d,", c[i][m].p, a[c[i][m].p]);
   m=m-a[c[i]][m].v;
   i--;
    }
}

 

posted @ 2013-01-26 19:16  xxx's blog  阅读(223)  评论(0编辑  收藏  举报