面试题:数组划分成两个子数组,和的差值的绝对值最小
2014-07-23 16:51
323 查看
01背包问题,好久没写,我的代码不是很好看,而且没测试
这是网上别人的代码:
#include <iostream> #include <string> #include <memory.h> #include <vector> using namespace std; //给定一个数组,分成两组后,求两组的和的差的绝对值最小。 //元素值大于0,没有负数;元素个数小于100 /* 思路:背包问题,求最接近sum/2的子数组即可。 */ int dp[101][10001]; int fun(vector<int> &arr) { int sum = 0; int n = arr.size(); int i; for(i = 0 ; i < n ; ++i) { sum += arr[i]; } int sumorg = sum; sum = sum/2; for(i = 0 ; i <= sum ; ++i) { dp[0][i] = 0; } int j; for(i = 1 ; i <= n ; ++i) { for(j = arr[i-1]; j <= sum ; ++j) { dp[i][j] = max(dp[i][j],dp[i-1][j-arr[i-1]+arr[i-1]); } } return abs(sumorg,dp [sum]); } int main() { return 0; }
这是网上别人的代码:
#include <iostream> #include <cstdio> #include <cstring> //for memset #include <algorithm> //for max using namespace std; const int M = 100 + 10; int w[M]; int dp[M*100]; 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]; } memset(dp, 0, sizeof(dp)); memset(state, 0, sizeof(state)); for (int i = 0; i < n; ++i) for (int j = sum/2; j >= w[i]; --j) { if (dp[j] < dp[j-w[i]] + w[i]) { dp[j] = dp[j-w[i]] + w[i]; state[i][j] = true; } } printf("%d\n", sum - dp[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; }
相关文章推荐
- 面试题31:数组中的最小绝对值
- [面试题] 求数组两两之差绝对值最小的值(Update Version)
- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。 (微软面试题)
- 百度面试题:求一个已排序的数组中绝对值最小的元素
- 找出整数数组中两个数差值的绝对值最小
- [经典面试题]排序数组中绝对值最小元素
- 面试题81:有序数组中绝对值最小的元素
- 华为06年面试题——求交换数组元素后差值最小方案
- 【转】[面试题] 求数组两两之差绝对值最小的值
- 一道面试题:有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- 微软面试题,求数组中两两之差绝对值最小的值。O(n)
- 将一个数组划分为和差值最小的子数组
- 将一个数组划分为和差值最小的子数组
- 划分数组,求最小差值
- 百度面试题:从已排序的数组中求绝对值最小的元素
- 百度面试题:求一个已排序的数组中绝对值最小的元素
- 找出整数数组中两个数差值的绝对值最小
- [面试题] 求数组两两之差绝对值最小的值
- 终于搞清楚了C#二进制的一些关键操作了,解决了微软面试题,求数组中两两之差绝对值最小的值O(N)最少内存限制的问题!
- 算法--微软面试题:求一个整数数组元素间最小差值