一个整数数组,长度为n,将其分为m 份,使各份的和相等,求m 的最大值

来源:互联网 发布:李逵捕鱼倍数算法 编辑:程序博客网 时间:2024/04/28 14:58

一个整数数组,长度为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。

#include <stdio.h>bool function_core(int *a, int n, int m, int groupsum, int *group, int goal, int groupid){if(goal < 0)return false;if(goal == 0){groupid++;goal = groupsum;if(groupid == m+1)return true;}for(int i=0;i<n;i++){if(group[i])continue;group[i] = groupid;if(function_core(a,n,m,groupsum,group,goal-a[i],groupid))return true;group[i] = 0;}return false;}int function(int *a, int n){int sum = 0,i;int *group = new int[n];for(i=0;i<n;i++){sum += a[i];}for(int m=n; m>=2; m--){if(sum%m != 0)continue;for(i=0;i<n;i++)group[i] = 0;group[0] = 1;if(function_core(a,n,m,sum/m,group,sum/m-a[0],1))//只需判断数组第一个元素分组情况,如果第一个元素无法分组,说明这个m是无效的{printf("分组情况:\n");for(i=0;i<n;i++)printf("%d\t",group[i]);printf("\n");delete [] group;group = NULL;return m;}}return 1;}int main(){int a[] = {2, 6, 4, 1, 3, 9, 7, 5, 8, 10};int n = sizeof(a)/sizeof(int);printf("数组为:\n");for(int i=0;i<n;i++)printf("%d\t",a[i]);printf("\n");printf("最大分组数为:%d\n",function(a,n));return 0;}


原创粉丝点击