一个数字划分成两个之差最小的数组问题
一个数字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--; } }