整数数组,长度为n,分为m份。求m最大值

题目:.一个整数数组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值.

                     此过程可以用递归。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;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值