最大化总和的差异

时间:2014-11-16 16:16:29

标签: c++ algorithm

鉴于N书和书架。书架只有2个空架子。现在我们有两个限制来保持书架上的书。

  1. 只能将M(整数)书籍放在顶层书架上,其余书籍放在底部书架上。
  2. 顶层书架上书籍的重量总和与底架书籍重量之和的差异应该是所有这些安排中最重要的。
  3. 现在,我们将获得N和所有书籍的权重以及M.我们需要告诉这个最大差异。

    例子:设N = 5,M = 2,书籍权重为[4,1,3,2,5],然后答案为9。

    如何针对给定的N个权重和M来处理此问题。

    我的方法:我首先想到的是,可以通过对砝码进行排序,然后将前M个书放在第一个架子上来实现贪婪的方法。如果这是正确的,我想要求正确性证明? 否则我想要正确解决这个问题?

    约束:1&lt; = n&lt; = 10000并且我们可以假设1 <= m <= n / 2.同样1&lt; = p [i]&lt; = 1000000

    代码:

        int n,m;
        cin>>n>>m;
        vector<long long int> a;
        for(int i=0;i<n;i++){
            long long int x;
            cin>>x;
            a.push_back(x);
        }
        sort(a.begin(),a.end());
        long long int upper=0,lower=0;
        for(int i=0;i<m;i++){
            upper+=a[i];
        }
        for(int i=m;i<n;i++){
            lower+=a[i];
        }
        cout<<lower-upper<<"\n";
    

1 个答案:

答案 0 :(得分:0)

如果2个架子的重量之间的差异要最大化那么我认为你概述的贪婪方法将有效。如果最重的M书放在最上面的架子上,那么另一个书架上没有书,如果这两本书被交换,这将增加差异。

另一方面,如果您希望最小化重量差异,那么问题是NP难度,请参阅条目here