一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值
2015-01-14 11:43
417 查看
划分为m块时,需要具备的条件:
m的取值为1~n
每一部分之和为 sum/m; (sum为数组元素之和)
sum % m == 0,否则不可能平分
递归思想:
假设分为m块,每一块之和即为subSum = sum / m。subSum即为每一块元素之和。
如果array[i]在某一个块中,则需要在数组的其中元素中找出和值为(subSum - array[i])的组合。
利用bool数组标记元素是否已分配到每一块中。
代码如下:
m的取值为1~n
每一部分之和为 sum/m; (sum为数组元素之和)
sum % m == 0,否则不可能平分
递归思想:
假设分为m块,每一块之和即为subSum = sum / m。subSum即为每一块元素之和。
如果array[i]在某一个块中,则需要在数组的其中元素中找出和值为(subSum - array[i])的组合。
利用bool数组标记元素是否已分配到每一块中。
代码如下:
#include <iostream> #include <vector> using namespace std; // 从数组中找出和为sum的组合。 bool DivideArray(int arr[], bool tags[], int size, int sum) { if (sum < 0) return false; else if (sum == 0) return true; for (int i = size - 1; i >= 0; i--) { if ((!tags[i]) && (arr[i] <= sum)) { tags[i] = true; if (DivideArray(arr, tags, size, sum - arr[i])) return true; else tags[i] = false; } } return false; } int DivideArray(int arr[], int size) { if (size <= 1) return (size >= 0 ? size : 0); // 计算数组元素之和 int m, sum, i; m = sum = 0; for (int i = 0; i < size; i++) sum += arr[i]; bool *tags = new bool[size]; for (m = size; m > 1; m--) { if (sum % m != 0) continue; memset(tags, 0, sizeof(bool) * size); for (i = 0; i < size; i++) { if (!tags[i]) { // 如果元素i没有分块,就将其分块。 tags[i] = true; // 如果i元素分块失败,就跳出for循环,m值失败。 if (!DivideArray(arr, tags, size, sum / m - arr[i])) break; } } if (i >= size) { // 如果i>=size,表示数组元素都被成功分配,此时m为最大值。 break; } } return m; } int main() { int arr[] = {1,2, 2, 7, 8}; printf("%d\n", DivideArray(arr, sizeof(arr)/sizeof(int))); getchar(); return 0; }
相关文章推荐
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 【编程题目】一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值★★ (自己没有做出来!!)
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m 的最大值比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 {3,3}{2
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值。
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值。
- 一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 【微软谷歌面试100题--【45】一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值
- 算法习题45:对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一;;;一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值 比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 {3,3}{2,4}{6
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 每日一道算法题:一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 面试题系列-整数数组长度为n,分为m份使各份的和相等,求最大的m
- 45一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数组,长度为 n,将其分为 m 份,使各的和相等求 m 的最大值,比如{3,2,4,3,6} 可以分成{3,2,4,3,6,} m=1;{3,6}{2,4,3}m=2 {3,3}{2,4}{6}
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m.(下)