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

一个数字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--;
    }
}

 

转载于:https://www.cnblogs.com/gaoqichao/archive/2013/01/26/2878102.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值