题目链接: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 ;
}

最新文章

  1. 再部署一个 instance 和 Local Network - 每天5分钟玩转 OpenStack(131)
  2. MYSQL删除重复数据
  3. mvc实现上传视频预览
  4. Hessian 二进制RPC协议框架
  5. 用fontAwesome代替网页icon小图标
  6. [转载] Android Metro风格的Launcher开发系列第一篇
  7. 【secureCRT】如何在secureCRT上设置常用的快捷输出按钮栏
  8. 使用Apache CXF开发WebServices服务端、客户端
  9. self._raiseerror(v) File &quot;D:\GameDevelopment\Python27\lib\xml\etree\ElementTree.py&quot;, line 1506, in _raiseerror
  10. Mongodb 设置密码
  11. ice cave
  12. Light OJ 1316 A Wedding Party 最短路+状态压缩DP
  13. MySQL Block Nested Loop and Batched Key Access Joins(块嵌套循环和批量Key访问连接)
  14. Android组件化框架设计与实践
  15. Mahout推荐算法之SlopOne
  16. L1-Day14
  17. Java拦截器
  18. Codeforces 1082B Vova and Trophies 模拟,水题,坑 B
  19. BZOJ 3994: [SDOI2015]约数个数和3994: [SDOI2015]约数个数和 莫比乌斯反演
  20. Jmeter(十二)关联

热门文章

  1. node.js+express+jade系列四:jade嵌套的使用
  2. Hibernate学习---第十五节:hibernate二级缓存
  3. 一个类的类类型是Class类的实例,即类的字节码
  4. 3_observer
  5. Java 网络通信(TCP/UDP)
  6. Cot
  7. 2017-2018-1 20179203 《Linux内核原理与分析》第三周作业
  8. bzoj 1132: [POI2008]Tro 计算几何
  9. 【Google】循环字符串里面的独立子串
  10. debian软件安装和卸载