/*
* 一个整数数组,长度为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
*/
//测试 以goal为目标,在groupId这个组,行得通吗?
//a[]表示数组,n为长度,m表示要分成几组,sum表示总数,
//groupsum表示一组的和,aux用于保存相应数的组数,0说明还没用到这个数。goal表示还剩多少,groupId现在是第几组
* 一个整数数组,长度为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
*/
//测试 以goal为目标,在groupId这个组,行得通吗?
//a[]表示数组,n为长度,m表示要分成几组,sum表示总数,
//groupsum表示一组的和,aux用于保存相应数的组数,0说明还没用到这个数。goal表示还剩多少,groupId现在是第几组
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
bool testShare(int s[],int n,int m,int groupSum,int goal,int aux[],int groupId)
{
if(goal ==0)
{
goal=groupSum;
if (++groupId == m + 1) return true;
}
for(int i=0;i<n;++i)
{
if(aux[i]) continue; //去掉已经选过的
aux[i]=groupId;
if(testShare(s,n,m,groupSum,goal-s[i],aux,groupId)) return true;
aux[i]=0; //还原
}
return false;
}
int maxShare(int s[],int len)
{
//m表示分成几组
int i,m, sum=0;
int aux[len];
for(i=0;i<len;i++) sum+=s[i]; //求总和
for(m=len;m>=2;--m)
{
if(sum%m !=0) continue; //不能被m整除,肯定不能平分
memset(aux,0,sizeof(int)*len);
if (testShare(s, len, m, sum / m, sum / m, aux, 1))
{
for (i = 0; i < len; i++)
printf("%d ", aux[i]);
return m;
}
}
return 1;
}
int main()
{
int a[] ={ 5, 4, 2, 2, 1 ,4,6};
//int a[]={6,5,5,2};
printf("\n group:%d",maxShare(a, sizeof(a)/sizeof(int)));
}