一个数组由2n个整数组成,把这个数组分成两半,各有n个整数,求一个分法,使这两个子数组和的差最小
来源:互联网 发布:基于java会议管理系统 编辑:程序博客网 时间:2024/06/09 23:43
有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];
可以用动态规划来解决这个问题。代码如下:
#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_PEOPLE 100#define MAX_WEIGHT 450#define MAX_WEIGHT_SUM MAX_PEOPLE*MAX_WEIGHTusing namespace std;int weights[MAX_PEOPLE];//bool table[MAX_PEOPLE + 1][MAX_WEIGHT_SUM + 1]; bool** create2D(int x, int y) { bool **array = new bool*[x]; for (int i = 0; i < x; ++i) { array[i] = new bool[y]; memset(array[i], 0, sizeof(bool)*y); } return array;}void delete2D(int x, int y, bool **array) { for (int i = 0; i < x; ++i) { delete[] array[i]; } delete[] array;}void memset2D(int x, int y, bool **array) { for(int i = 0; i < x; ++i) memset(array[i], 0, sizeof(bool)*y);}int main(void) { int n, N, W, maxDiff, teamWeight, temp; int minWeight = MAX_WEIGHT, maxWeight = -1; cin >> N; while(N--) { cin >> n; W = 0; for(int i = 0; i < n; ++i) { cin >> weights[i]; if(weights[i] < minWeight) minWeight = weights[i]; if(weights[i] > maxWeight) maxWeight = weights[i]; W += weights[i]; } int maxW = maxWeight + (W>>1); int maxn = n>>1; int index = 0; /* table[j][i] = 1 if a team of j people can form i weight from K people, where k is implicit in loop table[j][i] = table[j-1][i-weight[j]] if i-weight[j] >=0 */ bool **table = create2D(maxn+1, maxW+1); //memset2D(maxn+1, maxW+1, table); //memset(table, 0, sizeof(table)); table[0][0] = true; /* for k people what can be formed?*/ for(int k = 0; k < n; ++k) { /* forming team of size j out of k people*/ for(int j = min(k, maxn) ; j >= 1; --j) { /* using j people out of k, can I make weight i?*/ for(int i = maxW; i >=minWeight ; --i) { if (table[j][i] == false) { /*do not consider k if more than allowable*/ index = i - weights[k]; if (index < 0) break; /*if without adding k, we can make the weight limit with less than one person then one can also make weight limit by adding k.*/ table[j][i] = table[j-1][index]; } /*outer if ends here*/ } /* ith loop */ } /* jth loop */ } /* kth loop */ maxDiff = MAX_WEIGHT_SUM ; teamWeight = 0; for(int i = 0; i <= maxW; ++i) { if (table[n/2][i]) { temp = abs(abs(W - i) - i); if (temp < maxDiff) { maxDiff = temp; teamWeight = i; } } } //delete2D(n+1, maxW+1, table); teamWeight = min(teamWeight, W-teamWeight); cout << teamWeight << " " << W - teamWeight << endl; if(N) cout << endl; } return 0;}
- 一个数组由2n个整数组成,把这个数组分成两半,各有n个整数,求一个分法,使这两个子数组和的差最小
- 给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数
- 162 有2个数组,里面有 N 个整数,看是否两个数组里存在一个同样的数
- 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个 子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。
- 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个 子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
- 把一个整数数组,分成个大小相同的子数组
- php 把一个数组分成有n个元素的二维数组的算法
- 编写将一个包含有20个数据的数组M分成两个数组,正整数数组P和负数数组N ,分别把这两个数组中的数据的个数显示出来
- 有一个数组,由正整数、负整数、零组成,求和最大的连续子数组
- 每天学习一算法系列(4) (输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和)
- 输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和
- 【C语言】输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
- 每天学习一算法系列(4) (输入一个整形数组,数组里有正数也有负数,数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和)
- 输入整形数组,数组里有正数也有负数,数组中一个或连续的多个整数组成数组的子数组,求所有子数组中和的最大值 ,例如输入的数组为{1,-2,3,10,-4,7,2,-5}和最大的子数组为{3,10,
- 给定一个整数n,和k,返回包含k个所有所有子数组
- 一个N个整数的无序数组,给你一个数sum,求出数组中是否存在两个数,使他们的和为sum
- 一个N个整数的无序数组,给你一个数sum,求出数组中是否存在两个数,使他们的和为sum
- 162 1. 给一个有N个整数的数组S..和另一个整数X,判断S里有没有2个数的和为X
- Bro简介与安装
- 通信时间和通信距离的关系
- 明天正式开始实施计划了
- 物联网简介
- 苹果雪豹版本10.6.X安装xcode 4.2 提示安装失败的解决方法
- 一个数组由2n个整数组成,把这个数组分成两半,各有n个整数,求一个分法,使这两个子数组和的差最小
- java如何将一个InputStream写入文件啊? 文件上传 java
- 使用one-jar-appgen快速生成jar文件嵌套的eclipse工程
- 303. Never too old to learn, never to late to learn. 亡羊补牢,为时未晚
- qsort and qsearch
- HTML_02(html+css的学习)
- .Net自定义控件 小结
- 倾听色彩的声音
- 一个新的CSS图片替换的技巧