将一堆正整数分为2组,要求2组的和相差最小。
例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的。
 
Input
第1行:一个数N,N为正整数的数量。
第2 - N+1行,N个正整数。
(N <= 100, 所有正整数的和 <= 10000)
Output
输出这个最小差
Input示例
5
1
2
3
4
5
Output示例
1

此题可以转换为0-1背包问题,总和为sum, 选定一堆,求出不超过 j 的最大值,那么另一堆的和就可求出,找出其中的最小值即可
物品的重量和价格是一样的
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <math.h>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int N;
int a[];
int dp[];
int sum; int main()
{
//freopen("1.txt", "r", stdin);
cin >> N;
for (int i = ; i <= N; i++) {
cin >> a[i];
sum += a[i];
} memset(dp, , sizeof(dp));
for (int i = ; i <= sum; i++)
if (a[] <= i)
dp[i] = a[];
else
dp[i] = ; for (int i = ; i <= N; i++) {
for (int j = sum; j >= ; j--) { //滚动数组,从右往左
if (j >= a[i])
dp[j] = max(dp[j], dp[j-a[i]]+a[i]);
}
} int ret = INF;
for (int i = ; i <= sum; i++) {
ret = min(ret, abs(sum-*dp[i]));
}
cout << ret; return ;
}

其实最小值是两堆分别从左右逼近sum/2时取得,所以可以求不超过sum/2的最大值,这样就出来的差值就是最小值

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <math.h>
#include <algorithm>
using namespace std; int N;
int a[];
int dp[];
int sum; int main()
{
//freopen("1.txt", "r", stdin);
cin >> N;
for (int i = ; i <= N; i++) {
cin >> a[i];
sum += a[i];
} int h = sum/;
memset(dp, , sizeof(dp));
for (int i = ; i <= h; i++)
if (a[] <= i)
dp[i] = a[];
else
dp[i] = ; for (int i = ; i <= N; i++) {
for (int j = h; j >= ; j--) { //滚动数组,从右往左
if (j >= a[i])
dp[j] = max(dp[j], dp[j-a[i]]+a[i]);
}
} int ret;
ret = abs(sum - *dp[h]);
cout << ret; return ;
}
 

最新文章

  1. 3.5 EF Code First总结
  2. I - Tri Tiling
  3. 软件测试——boost单元测试 C++
  4. asp.net 邮件发送类
  5. oracle进制转换
  6. [转]toString()方法
  7. 【最大点权独立集】【HDU1565】【方格取数】
  8. linux 工具: Top
  9. 使用VS Code从零开始开发调试.NET Core 1.1
  10. 奔跑在Docker上的Spark
  11. RBAC__权限设计__结构化表的输出(不知道怎么描述标题,反正就是设计表) 难点重点 必须掌握&#129302;
  12. Maven初解--依赖查找方法
  13. [Swift]LeetCode990. 等式方程的可满足性 | Satisfiability of Equality Equations
  14. eclipse修改android项目的apk包名类名
  15. 01-VMware-workstation14安装
  16. LODOP暂存、应用、复原 按钮的区别
  17. BZOJ2521[Shoi2010]最小生成树——最小割
  18. 知识点:linux数据库备份
  19. 使用Ajax的Time实现倒计时功能
  20. poj3352 Road Construction &amp; poj3177 Redundant Paths (边双连通分量)题解

热门文章

  1. 【题解】Cut the Sequence(贪心区间覆盖)
  2. 支付宝异步通知notify_url接收不了问题解决(转)
  3. PAT 天梯赛 L2-028. 秀恩爱分得快 【数据处理】
  4. chunkhash笔记
  5. adaptiveThreshold自适应二值化源码分析
  6. python读取文件的几种方式
  7. html5--1.11列表
  8. 分享知识-快乐自己: Oracle数据库实例、用户、表、表空间之间关系
  9. “libgomp.so.1: version `GOMP_4.0' not found” || “libstdc++.so.6: version `CXXABI_1.3.8' not found”错误
  10. Codeforces Gym 101190 NEERC 16 .D Delight for a Cat (上下界的费用流)