一个整数数组,长度为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]的值设为当前组号),继续判断下一个元素加入加入当前组的情况

[cpp] view plaincopy
  1. #include <cstdio>  
  2. #include <cstdlib>  
  3.   
  4. #define NUM 10  
  5.   
  6. int maxShares(int a[], int n);  
  7.   
  8. //aux[i]的值表示数组a中第i个元素分在哪个组,值为0表示未分配  
  9. //当前处理的组的现有和 + goal的值 = groupsum  
  10. int testShares(int a[], int n, int m, int sum, int groupsum, int aux[], int goal, int groupId);  
  11.   
  12. int main()  
  13. {  
  14.     int a[] = {2, 6, 4, 1, 3, 9, 7, 5, 8, 10};  
  15.   
  16.     //打印数组值  
  17.     printf("数组的值:");  
  18.     for (int i = 0; i < NUM; i++)  
  19.         printf(" %d ", a[i]);  
  20.   
  21.     printf("\n可以分配的最大组数为:%d\n", maxShares(a, NUM));  
  22.   
  23.     system("pause");  
  24.     return 0;  
  25. }  
  26.   
  27. int testShares(int a[], int n, int m, int sum, int groupsum, int aux[], int goal, int groupId)   
  28. {  
  29.     if (goal < 0)  
  30.         return 0;  
  31.   
  32.     if (goal == 0)  
  33.     {  
  34.         groupId++;  
  35.         goal = groupsum;  
  36.   
  37.         if (groupId == m+1)       
  38.             return 1;  
  39.     }  
  40.   
  41.     for (int i = 0; i < n; i++)   
  42.     {  
  43.         if (aux[i] != 0)  
  44.             continue;  
  45.   
  46.         aux[i] = groupId;  
  47.         if (testShares(a, n, m, sum, groupsum, aux, goal-a[i], groupId))   
  48.             return 1;  
  49.   
  50.         aux[i] = 0;             //a[i]分配失败,将其置为未分配状态  
  51.     }  
  52.   
  53.     return 0;  
  54. }  
  55. int maxShares(int a[], int n)  
  56. {  
  57.     int sum = 0;  
  58.     int *aux = (int *)malloc(sizeof(int) * n);            
  59.   
  60.     for (int i = 0; i < n; i++)   
  61.         sum += a[i];  
  62.   
  63.     for (int m = n; m >= 2; m--)   
  64.     {  
  65.         if (sum%m != 0)   
  66.             continue;  
  67.   
  68.         for (int i = 0; i < n; i++)   
  69.             aux[i] = 0;  
  70.   
  71.         if (testShares(a, n, m, sum, sum/m, aux, sum/m, 1))  
  72.         {  
  73.             //打印分组情况  
  74.             printf("\n分组情况:");  
  75.             for (int i = 0; i < NUM; i++)  
  76.                 printf(" %d ", aux[i]);  
  77.   
  78.             free(aux);  
  79.             aux = NULL;  
  80.             return m;  
  81.         }  
  82.     }  
  83.   
  84.     free(aux);  
  85.     aux = NULL;  
  86.     return 1;