一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
来源:互联网 发布:在淘宝管控记录扣分吗 编辑:程序博客网 时间:2024/04/28 21:23
转载网址: http://blog.csdn.net/peng_weida/article/details/7741888
本文代码参考网址:http://blog.csdn.net/v_july_v/article/details/6870251
问题描述:一个整数数组,长度为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} m=3 所以m 的最大值为3
算法分析:
初始值m从n开始,依次递减测试;数组的和为sum,若sum%m的值不为0,则直接跳过
对于符合sum%m = 0的每个m,扫描数组中每个元素,若该元素的状态为未选,将其分配到相应组
(1) 若当前组元素的和大于 sum/m,表明当前元素不适合该组,将其状态(aux[i])置为0
(2) 若当前组元素的和等于 sum/m, 将组号加1,继续进行下一组的判断
(3) 若当前组元素的和小于 sum/m,将当前加入的元素置为已选状态(aux[i]的值设为当前组号),继续判断下一个元素加入加入当前组的情况
- #include <cstdio>
- #include <cstdlib>
- #define NUM 10
- int maxShares(int a[], int n);
- //aux[i]的值表示数组a中第i个元素分在哪个组,值为0表示未分配
- //当前处理的组的现有和 + goal的值 = groupsum
- int testShares(int a[], int n, int m, int sum, int groupsum, int aux[], int goal, int groupId);
- int main()
- {
- int a[] = {2, 6, 4, 1, 3, 9, 7, 5, 8, 10};
- //打印数组值
- printf("数组的值:");
- for (int i = 0; i < NUM; i++)
- printf(" %d ", a[i]);
- printf("\n可以分配的最大组数为:%d\n", maxShares(a, NUM));
- system("pause");
- return 0;
- }
- int testShares(int a[], int n, int m, int sum, int groupsum, int aux[], int goal, int groupId)
- {
- if (goal < 0)
- return 0;
- if (goal == 0)
- {
- groupId++;
- goal = groupsum;
- if (groupId == m+1)
- return 1;
- }
- for (int i = 0; i < n; i++)
- {
- if (aux[i] != 0)
- continue;
- aux[i] = groupId;
- if (testShares(a, n, m, sum, groupsum, aux, goal-a[i], groupId))
- return 1;
- aux[i] = 0; //a[i]分配失败,将其置为未分配状态
- }
- return 0;
- }
- int maxShares(int a[], int n)
- {
- int sum = 0;
- int *aux = (int *)malloc(sizeof(int) * n);
- for (int i = 0; i < n; i++)
- sum += a[i];
- for (int m = n; m >= 2; m--)
- {
- if (sum%m != 0)
- continue;
- for (int i = 0; i < n; i++)
- aux[i] = 0;
- if (testShares(a, n, m, sum, sum/m, aux, sum/m, 1))
- {
- //打印分组情况
- printf("\n分组情况:");
- for (int i = 0; i < NUM; i++)
- printf(" %d ", aux[i]);
- free(aux);
- aux = NULL;
- return m;
- }
- }
- free(aux);
- aux = NULL;
- return 1;
- }
- 45一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为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 的最大值
- 每日一道算法题:一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 一个整数数组,长度为n,将其分为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 的最大值比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1; {3,6}{2,4,3} m=2 {3,3}{2
- 算法习题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最大值
- 硬盘、u盘等大容量设备分区表修复
- mysql必备导入导出数据库命令
- C03-Java同步实践加强班
- mysql 存储过程 根据参数 动态执行sql语句
- 10款iOS高效开发必备的Objective-C类库
- 一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- Servlet实现上传
- impdp使用心得
- access violation at address in module Read of address
- log buffer —— latch: redo writing,latch: redo allocation,latch: redo copy
- 采用命令行方式复制任意多个文件内容到一个文件中(华科保研机试)
- HDU1850 Being a Good Boy in Spring Festivaly
- 【解题报告】 NYOJ 78 -- 圈水池 Andrew 凸包算法
- Activity intent经常使用的 FLAG 集合(