题目:.一个整数数组a,长度为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
解答:找了半天没有更好的解法,以下两个思路供参考。
基本思想都是
1求出数组和SUM。
2假设可以分成m组,找到一个合适的m.
m的取值为sum%m=0,m<=sum/max(a)
3 从大到小验证找到一个可行的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
解答:找了半天没有更好的解法,以下两个思路供参考。
基本思想都是
1求出数组和SUM。
2假设可以分成m组,找到一个合适的m.
m的取值为sum%m=0,m<=sum/max(a)
3 从大到小验证找到一个可行的m值.
此过程可以用递归。f(a,m)=f(a-set,m-1)
int maxShares(int a[], int n)
{
int sum = 0;
int i, m;
for (i=0; i<n; i++) sum += a;
for (m=n; m>=2; m--)
{
if (sum mod m != 0) continue;
int aux[n]; for (i=0; i<n; i++) aux = 0;
if (testShares(a, n, m, sum, sum/m, aux, sum/m, 1)) return m;
}
return 1;
}
int testShares(int a[], int n, int m, int sum, int groupsum, int[] aux, int goal, int groupId)
{
if (goal == 0)
{
groupId++;
if (groupId == m+1) return 1;
}
for (int i=0; i<n; i++)
{
if (aux != 0) continue;
aux = groupId;
if (testShares(a, n, m, sum, groupsum, aux, goal-a, groupId))
{
return 1;
}
aux = 0;
}
}