Skip to content

Latest commit

 

History

History

数组的近似划分

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

readme.md

问题1:

给出一个数组,将他们分成两组(每组个数不一定是n个),然后使他们的差最小

背包问题的变形,可以看这个目录下面的背包问题2,背包问题有两种:

第一是物品有两个属性,一个是重量,一个是价值,然后给一个给装w的背包,问背包能装的最大价值?

第二种是物品有一个属性,就是物品的重量,然后给一个能装w的背包,问(在不分割物品的情况下面)背包能装最多的重量?


第二种情况的应用非常非常的广泛
1. 对于这个问题就是一个典型的第二种的背包问题,从一个数组里面,取出一些数字,使他们尽可能的接近sum/2(sum/2是背包能容纳的重量)

2. 另外一个例子,就是一个数组arr[4,2,3,10,6],表示的是cpu去完成一个任务需要的时间。现在有两个cpu去共同完成上面的任务,那么多长时间可以完成?
这个思路也是,将一个数组分成两个半,然后是他们的和尽可能的相等。

问题2:

任意2n个整数,从其中选出n个整数,使得选出的n个整数和同剩下的n个整数之和的差最小。

提供一个暴力法的思路,计算从2n里面取n个的所有组合,
找到一个追接近于sum/2的一个组合

问题2 来自《编程之美》 2.18章

问题3

想到之前面试微软的一道题目,给出一个数组arr,能否将数组分成两个部分,然后这两个部分的和相等。

当时面试的时候,被问这道题的时候,超级紧张,脑子里面一片浆糊,说了一个暴力的方法,面我的人很nice,给了我很多提示,和我一起讨论如何去优化它。仔细想一想,不就是问题1的变形吗?

对于一个arr=[a,b,c,d,e,f,g],如果可以构成 a+f+g=b+c+d+e,那么一定a+f+g=sum/2。

也就是说,对于一个背包问题2,从arr里面拿东西,最后的结果是,正好将背包装满。