`
caoruntao
  • 浏览: 480908 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

<编程之美>数组分割问题

 
阅读更多

【转】http://www.cppblog.com/baby-fly/archive/2009/08/06/92392.aspx

 

题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。
假设数组A[1..2N]所有元素的和是SUM。模仿动态规划解0-1背包问题的策略,令S(k, i)表示前k个元素中任意i个元素的和的集合。显然:
S(k, 1) = {A[i] | 1<= i <= k}
S(k, k) = {A[1]+A[2]+…+A[k]}
S(k, i) = S(k-1, i) U {A[k] + x | x属于S(k-1, i-1) }
按照这个递推公式来计算,最后找出集合S(2N, N)中与SUM最接近的那个和,这便是答案。这个算法的时间复杂度是O(22N).
因为这个过程中只关注和不大于SUM/2的那个子数组的和。所以集合中重复的和以及大于SUM/2的和都是没有意义的。把这些没有意义的和剔除掉,剩下的有意义的和的个数最多就是SUM/2个。所以,我们不需要记录S(2N,N)中都有哪些和,只需要从SUM/2到1遍历一次,逐个询问这个值是不是在S(2N,N)中出现,第一个出现的值就是答案。我们的程序不需要按照上述递推公式计算每个集合,只需要为每个集合设一个标志数组,标记SUM/2到1这个区间中的哪些值可以被计算出来。关键代码如下:

for(i = 0; i < N+1; i++)   
    for(j = 0; j < sum/2+1; j++)   
        flag[i][j] = false;   
flag[0][0] = true;   
for(int k = 1; k <= 2*N; k++) {   
    for(i = k > N ? N : k; i >= 1; i--) {   
        //两层外循环是遍历集合S(k,i)   
        for(j = 0; j <= sum/2; j++) {   
            if(j >= A[k] && flag[i-1][j-A[k]])   
                flag[i][j] = true;   
        }   
    }   
}   
for(i = sum/2; i >= 0; i--) {   
    if(flag[N][i]) {   
        cout << "minimum delta is " << abs(2*i - sum) << endl;   
        break;   
    }   
}  

 

分享到:
评论

相关推荐

    数组分割1

    该问题源于《编程之美》中的2.18章节,同时也是July的《微软等公司面试100题》中的32题,主要探讨如何通过交换两个序列的元素,使得两个序列元素之和的差最小。这个问题的关键在于找到一种有效的交换策略,使得两个...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    &lt;/TITLE&gt; &lt;/HEAD&gt; &lt;BODY&gt; &lt;H1&gt; First PHP page &lt;/H1&gt; &lt;HR&gt; &lt;? // Single line C++ style comment /* printing the message */ echo "Hello World!"; # Unix style single line comment ?&gt; &lt;/BODY&gt; &lt;/HTML&gt; 2.4 数据...

    higtchars pie饼图

    &lt;div id="container"&gt;&lt;/div&gt; &lt;script&gt; Highcharts.chart('container', { chart: { type: 'pie' }, title: { text: '饼图示例' }, series: [{ name: '类别', data: [ ['类别1', 30], ['类别2', 50], ...

    PHP程序设计PPT

    echo "连接成功&lt;br&gt;"; // SQL查询 $sql = "SELECT id, firstname, lastname FROM MyGuests"; $result = $conn-&gt;query($sql); if ($result-&gt;num_rows &gt; 0) { // 输出数据 while($row = $result-&gt;fetch_assoc()) {...

    编程题刷的题库

    这些题目来自于一家著名的通信设备制造商,通常用于校园招聘的编程测试,旨在评估应聘者的编程能力、逻辑思维和问题解决技巧。下面将逐一分析这些题目,介绍相关知识点。 1. **华为 - 坐标.c** 这个题目可能涉及到...

    【顿开教育】C语言美女拼图游戏

    游戏的核心在于使用C语言的控制结构(如if语句、for循环和while循环)以及数组和指针等概念,来实现图片的分割、显示、移动和重组。在编写代码的过程中,开发者需要思考如何正确处理图像数据,如何实现用户交互,...

    原生js html5简单的美女拼图游戏源码下载

    HTML5引入了一些新的语义元素,如`&lt;header&gt;`、`&lt;main&gt;`、`&lt;section&gt;`、`&lt;article&gt;`和`&lt;footer&gt;`,这些元素用于增强网页的可读性和可访问性。在这个游戏中,它们可能被用来组织页面结构。 2. **CSS样式与布局**: ...

    美女拼图游戏

    【美女拼图游戏】是一款专为初级开发者设计的源码项目,旨在帮助他们了解和...通过学习这个【美女拼图游戏】的源码,初学者不仅能掌握游戏开发的基本流程,还能锻炼解决问题的能力,为未来更复杂的项目打下坚实基础。

    爱心源码-讲解numpy包相关数组在实际应用中的使用方法

    - 数组拆分:`np.split()`、`np.array_split()`和`np.hsplit()`等函数可以将数组分割成多个子数组。 4. **数学与统计操作**: - 基础数学运算:如加法、减法、乘法、除法等,可以对整个数组进行。 - 算术统计:...

    IOI国家集训队论文集1999-2019

    &lt;small&gt;&lt;i&gt;&lt;a href='http://ecotrust-canada.github.io/markdown-toc/'&gt;Table of contents generated with markdown-toc&lt;/a&gt;&lt;/i&gt;&lt;/small&gt; --- ## 1999 陈 宏 -《数据结构的选择与算法效率——从IOI98试题PICTURE...

    Android游戏源码安卓美女拼图游戏

    《Android游戏源码安卓美女拼图游戏》是一个适合Android初学者和高级开发者研究的项目,它揭示了...通过深入研究源码,你可以了解到一个完整的游戏项目是如何从概念到实现,从而提高你的编程素养和解决问题的能力。

    Android小游戏美女拼图实现点击选择再点击互换位置实现拼图过关;可以做为一个验证码.rar

    Android使用XML来定义用户界面,我们可以使用`&lt;ImageView&gt;`控件展示拼图的各个部分。为了实现拼图效果,我们需要预先准备完整的美女图片,然后将其分割成多个小块。这通常通过图像处理库如Picasso或Glide来完成,...

    webgl编程指南及源码2/2

    文件太大,分割成两个文件了。 原书名:WebGL Programming Guide: Interactive 3D Graphics Programming with WebGL (OpenGL) 原出版社: Addison-Wesley Professional 作者: (美)Kouichi Matsuda Rodger Lea(松田...

    n阶幻方的C#实现

    1. 对于更深入的理论背景,可参考《数学之美》一书中关于幻方的章节。 2. 在线资源,如维基百科的幻方词条,提供了更多关于幻方历史和构造方法的信息。 3. 计算机科学课程,如数据结构和算法,也经常包含幻方的编程...

    webgl编程指南及源码1/2

    文件太大,分割成两个文件了。 原书名:WebGL Programming Guide: Interactive 3D Graphics Programming with WebGL (OpenGL) 原出版社: Addison-Wesley Professional 作者: (美)Kouichi Matsuda Rodger Lea(松田...

    因数与倍数PPT模板:数学之美.pptx

    5. 计算机科学:在编程中,数组的大小通常是2的幂,利用因数和倍数的性质可以优化数据结构和算法。6. 环境科学:在环境科学中,生态系统的能量流动和物质循环也涉及因数和倍数的概念。结论因数与倍数是数学中的基础...

    MFC制作美女拼图

    在程序启动时,我们可以读取美女图片,将其分割成多个小块,并保存在内存中。这个过程可能涉及到图像处理技术,例如使用OpenCV库进行图像切割。每个小块的信息,包括其原始位置和当前位置,可以存储在一个结构体数组...

    面试算法整理

    题目来源于《剑指Offer》这本书中的第29题,同时参考了《编程之美》中关于寻找“发帖水王”的问题。这两个来源均提供了不同的解题思路和方法论。 **解法一:基于快排中分割算法的方法** 1. **基本思想**: - 通过...

    mandbrot:动态曼德尔布罗特集

    fn save_image(image: ImageBuffer&lt;Rgb&lt;u8&gt;, Vec&lt;u8&gt;&gt;, filename: &str) { // ... } ``` 最后,结合以上功能,我们可以创建一个主程序,接受用户输入,生成曼德布罗集,并将其保存为图像文件。在实际应用中,我们...

    C语言编程练习题

    本资源整理了 32 个 C 语言编程练习题,涵盖了基本的数据类型、运算符、控制结构、函数和数组等内容。这些练习题旨在帮助初学者熟悉 C 语言的基本概念和编程技巧,并为更深入的学习和实践打下基础。 1. float 类型...

Global site tag (gtag.js) - Google Analytics