要求:将数组中的数划分为两组,使得两个子数组的和的差值最小,数组中的数的取值范围为0<X<100,元素个数也是大于0小于100.如:a[]={2,4,5,6,7},得出的两组数:{2,4,6}和{5,7},abs(sum(a1)-sum(a1))=0;如:{2,5,6,10},abs(sum(2,10)-sum(5,6))=1所以:子数组为:{2,10}和{5,6}。

思路:很容易知道如果选取的某个子数组的和currentSum=sum/2,则这两个子数组的和的差值最小,即从数组中选取某些数字使得其和接近整个数组的1/2.,所以该命题本质上是一个01背包命题,原命题等价于从n各物品中选取若干个,其重量不超过sum/2,且重量达到最大
基于上述思路代码如下:
#include <iostream>
using namespace std;const int M = 100;
int w[M];
int currentSum[M*M];
bool state[M][M];
int main()
{int n;while (scanf("%d ", &n) != EOF) {//输入数组元素个数int sum = 0;for (int i = 0; i < n; ++i) {scanf("%d", &w[i]);sum += w[i];//sum存储整个数组元素的和}memset(currentSum, 0, sizeof(currentSum));memset(state, 0, sizeof(state));for (int i = 0; i < n; ++i)for (int j = sum/2; j >= w[i]; --j) {if (currentSum[j] < currentSum[j-w[i]] + w[i]) {currentSum[j] =currentSum[j-w[i]] + w[i];state[i][j] = true;}}printf("%d\n", sum - currentSum[sum/2]*2);int i = n, j = sum/2;while (i--) {if (state[i][j]) {printf("%d ", w[i]);j -= w[i];}}printf("\n");}return 0;
}

程序运行结果如下:

转载于:https://www.cnblogs.com/hainange/p/6334064.html

将一个数组划分为和差值最小的子数组相关推荐

  1. Leonard代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。

    第一章数组 (今日任务) 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,总结 建议大家先独立做题,然后看视频讲解,然后看文章讲解,然后在重新做一遍题,把题目AC,最后整理 ...

  2. 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。

    代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II. 977.有序数组的平方 209. 长度最小的子数组 59. 螺旋矩阵 II 977.有序数组的 ...

  3. 代码随想录训练营第二天|LeetCode977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

    day2 | LeetCode977.有序数组的平方.209.长度最小的子数组.59.螺旋矩阵II 创建时间: October 13, 2022 3:29 PM 一.今日任务 977.有序数组的平方 ...

  4. 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...

  5. 代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II 一. LeetCode977.有序数组的平方 1. 题目链接[LeetCode9 ...

  6. 代码随想录Day02 | LeetCode977.有序数组的平方、LeetCode209.长度最小的子数组、LeetCode59.螺旋矩阵II

    977.有序数组的平方 力扣题目链接(opens new window) 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 示例 1: ...

  7. 代码随想录第二天 |LeetCode977.有序数组的平方,LeetCode209.长度最小的子数组,LeetCode59.螺旋矩阵II

    LeetCode977.有序数组的平方 977. 有序数组的平方 - 力扣(LeetCode) 暴力解法: 一开始不习惯用双指针解法,习惯性先平方再用双指针,发现做不出了HH.于是愉快的用传统暴力解法 ...

  8. 代码随想录算法训练营第二天|leetcode 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    leetcode 977.有序数组的平方 想到昨天写的双指针,十分刻意用了一下,感觉还是比较生疏,还得加强练习和思考,然后发现还需要排序,想到了vector的排序sort(),但是觉得直接用不好,也忘 ...

  9. 代码随想录算法训练营第二天|LeetCode977.有序数组的平方,209.长度最小的子数组, 59.螺旋矩阵II

    题目连接:977.有序数组的平方 暴力法:将数组所有元素平方然后再排序(未利用题目条件:原始数组按照非降序排列) 双指针法:数组中各元素符号有三种情况:①所有元素非负(将数组中元素平方即可).②所有元 ...

最新文章

  1. 0729------Linux网络编程----------使用 select 、poll 和 epoll 模型 编写客户端程序
  2. 降低数据中心功耗的 4 大方法
  3. 一个草根交通研究员的拼车产品分析
  4. Winform中实现颜色拾取器获取RGB与16进制颜色程序与源码分享
  5. SAP UI5应用入口App.controller.js是如何被UI5框架加载的?
  6. android可点击的列表,如何在Android的可扩展列表视图中的子点击...
  7. 伪分布式hbase数据迁移汇总
  8. bash for循环_Bash 中的 For 循环
  9. opencv mat数据剪裁感兴趣的部分处理方法
  10. linux账户初始化文件,Linux启动初始化配置文件浅析
  11. js字符串方法、数组方法整理
  12. Extjs 实现Iframe的子窗口遮罩整个页面
  13. 编程人的「对象」长啥样?
  14. 动态更新 HTML 内容 —— AJAX
  15. Linq学习比较第2篇
  16. canvas画布会黑屏吗_你真的会绷油画布吗?
  17. SCU4487 king's trouble I(深搜DFS)
  18. 【9.8校内测试】【贪心/树规】【环覆盖问题】【线性规划】
  19. Jenkins搭建.NET自动编译测试并实现半增量部署
  20. 苹果手机投屏软件_小技巧!苹果手机怎么投屏到笔记本?

热门文章

  1. 打桥位lisp_lisp函数
  2. centos6 安装 mantisbt-1.2.8 —— (3)Linux系统下yum源配置(Centos 6)
  3. 函数参数 不定参数,和 默认参数
  4. 向PHP使用Post方式上传文件
  5. MySQL-数据类型
  6. Mysql错误问题:ERROR 1005 (HY000): Can't create table 'crm_1.tbl_client' (errno: 150)
  7. JQ用变量关联input name
  8. 码农们不得不重视的问题
  9. Linux -- free 命令 内存适用状态监控
  10. 视频处理的知识_开源项目_项目列表