题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1007

题意:中文题诶~

思路:尽量将一个数组分成两个相等的部分,就是从原数组中选出一些元素使其和尽量接近所有元素的和的一半啦.至于如何选元素,我们可以用01背包解决;

假设原数组所有元素和为sum,那么可以分为 ans1 >= sum/2 和 ans2 <= sum/2 两部分,为了方便我们求 ans2 <=sum/2那部分, 那么此题的答案即为  sum-2*ans2,

接下来我们只要考虑如何用01背包求ans2就好啦;

我们用 dp[i][j] 表示到地 i 个元素为止,选择的元素和小于等于 j 的最大值,那么有 ans2=dp[n][num/2];

状态转移方程式为:

dp[i][j] = max (dp[i-1][j], dp[i-1][j-a[i]]+a[i]) 前者为不选当前元素,后者为选当前元素.注意后者状态的转变,最接近 j-a[i] 的那个数加上 a[i] 自然就是最接近 j 的数啦.

代码:

#include <bits/stdc++.h>
#define MAXN 110
using namespace std; int a[MAXN], dp[MAXN][MAXN*MAXN]; //dp[i][j]存储的到地i个元素为止,可以得到的小于等于j的最大值 int main(void){
int n, sum=;
cin >> n;
for(int i=; i<=n; i++){
cin >> a[i];
sum+=a[i];
}
for(int i=; i<=n; i++){
for(int j=sum/; j>=a[i]; j--){
dp[i][j]=max(dp[i-][j], dp[i-][j-a[i]]+a[i]);//选或不选a[i]
}
}
cout << sum-*dp[n][sum/] << endl;
return ;
}

上述算法的时间复杂度和空间复杂度分别为:O(sum*n), O(sum*n);

我们可以进一步优化一下空间复杂度,通过上面的代码我们不难发现 dp[i][j] 都是由 dp[i-1][j] 得到的,也就是我们是直接由前一步的答案得到后一步结果的,直至得到最终答案.那么我们可以不存储前面的数据.用 dp[j]存储当前能得到的小于等于 j 的最大值,然后逐步更新dp[j]的值就可以得到答案啦;

其空间复杂度为 O(sum)

代码:

 #include <bits/stdc++.h>
#define MAXN 110
using namespace std; int a[MAXN], dp[MAXN*MAXN]; //dp[j]存储可以得到的小于等于j的最大值 int main(void){
int n, sum=;
cin >> n;
for(int i=; i<n; i++){
cin >> a[i];
sum+=a[i];
}
for(int i=; i<n; i++){ //外循环通过选中a[i]来更新dp[j]的值
for(int j=sum/; j>=a[i]; j--){
dp[j]=max(dp[j], dp[j-a[i]]+a[i]);
}
}
cout << sum-*dp[sum/] << endl;
return ;
}

51nod1007(01背包)的更多相关文章

  1. UVALive 4870 Roller Coaster --01背包

    题意:过山车有n个区域,一个人有两个值F,D,在每个区域有两种选择: 1.睁眼: F += f[i], D += d[i] 2.闭眼: F = F ,     D -= K 问在D小于等于一定限度的时 ...

  2. POJ1112 Team Them Up![二分图染色 补图 01背包]

    Team Them Up! Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7608   Accepted: 2041   S ...

  3. Codeforces 2016 ACM Amman Collegiate Programming Contest A. Coins(动态规划/01背包变形)

    传送门 Description Hasan and Bahosain want to buy a new video game, they want to share the expenses. Ha ...

  4. 51nod1085(01背包)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1085 题意: 中文题诶~ 思路: 01背包模板题. 用dp[ ...

  5. *HDU3339 最短路+01背包

    In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. codeforces 742D Arpa's weak amphitheater and Mehrdad's valuable Hoses ——(01背包变形)

    题意:给你若干个集合,每个集合内的物品要么选任意一个,要么所有都选,求最后在背包能容纳的范围下最大的价值. 分析:对于每个并查集,从上到下滚动维护即可,其实就是一个01背包= =. 代码如下: #in ...

  7. POJ 3624 Charm Bracelet(01背包)

    Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34532   Accepted: 15301 ...

  8. (01背包变形) Cow Exhibition (poj 2184)

    http://poj.org/problem?id=2184   Description "Fat and docile, big and dumb, they look so stupid ...

  9. hdu3339 In Action(Dijkstra+01背包)

    /* 题意:有 n 个站点(编号1...n),每一个站点都有一个能量值,为了不让这些能量值连接起来,要用 坦克占领这个站点!已知站点的 之间的距离,每个坦克从0点出发到某一个站点,1 unit dis ...

随机推荐

  1. C#中在内容页获取其模板页中的变量,或者值

    在CSDN的博文中看到了 muziduoxi 的文章:http://blog.csdn.net/muziduoxi/article/details/5386543 虽然里面提到的方法没有解决我的难题, ...

  2. name lookup of 'res' changed for new ISO 'res' scoping

    #include<iostream> using namespace std; int pow ( int val, int exp ); int main() { int val = 2 ...

  3. shingling算法——提取特征,m个hash函数做指纹计算,针对特征hash后变成m维向量,最后利用union-find算法计算相似性

    shingling算法用于计算两个文档的相似度,例如,用于网页去重.维基百科对w-shingling的定义如下: In natural language processing a w-shinglin ...

  4. 全面解析Bootstrap手风琴效果

    触发手风琴可以通过自定义的data-toggle 属性来触发.其中data-toggle值设置为 collapse,data-target="#折叠区标识符". 第一步:设计一个面 ...

  5. 使用Chrome采集摄像头并生成视频下载

    主要使用2个技术点:WebRtc 的 getUserMedia 和 MediaRecorder 注意点 开始录制调用 start 方法要传入一个采样间隔,这样录制的媒体会按照你设置的值进行分割成一个个 ...

  6. linux命令学习笔记(53):route命令

    Linux系统的route命令用于显示和操作IP路由表(show / manipulate the IP routing table).要实现两 个不同的子网之间的通信,需要一台连接两个网络的路由器, ...

  7. C语言访问MCU寄存器的两种方式

    转自http://blog.csdn.net/liming0931/article/details/7752248 单片机的特殊功能寄存器SFR,是SRAM地址已经确定的SRAM单元,在C语言环境下对 ...

  8. 搭建 Http Dynamic Streaming 点播/直播服务器

    1.        HTTP Origin Module的处理数据流: a)         客户端发送媒体索引请求到Apache.例如: http://www.example.com/media/  ...

  9. [转]七个对我最好的职业建议(精简版)--Nicholas C. Zakas

    一.不要别人点什么,就做什么 我的第一份工作,只干了8个月,那家公司就倒闭了.我问经理,接下来我该怎么办,他说: "小伙子,千万不要当一个被人点菜的厨师,别人点什么,你就烧什么.不要接受那样 ...

  10. POJ1456:Supermarket

    浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:http://poj.org/problem?id=1456 把物品按照时间排序,显然\ ...