zoukankan      html  css  js  c++  java
  • 一个数字划分成两个之差最小的数组问题

    一个数字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--;
        }
    }
  • 相关阅读:
    Jquery+ajax+bootstrap
    Js+Jquery
    css(2)+JS
    css
    mysql 高级
    Git
    Redis
    Nginx
    python爬虫 | 一条高效的学习路径
    拉勾网爬取全国python职位并数据分析薪资,工作经验,学历等信息
  • 原文地址:https://www.cnblogs.com/gaoqichao/p/2878102.html
Copyright © 2011-2022 走看看