这应该是网上比较常见的题目了,但由于本人新手,决定练练手,实现一下。
解题思路:注意m,肯定能被数组的和整除,得到的结果是分成m份之后的和。可以考虑从m=n时开始递归,直接求得符合条件的m即为最大的,代码如下:
#include <iostream>
using namespace std;
int findsubsum(int a[],int n,int m,int goal,int aux[],int sum,int groupid){
if(goal <0)
return 0;
if(goal ==0){
groupid++;
goal = sum;
if(groupid == m+1)
return 1;
}
for(int i=0;i<n;i++){
if(aux[i] != 0)
continue;
aux[i] = groupid;
if(findsubsum(a,n,m,goal-a[i],aux,sum,groupid))
return 1;
aux[i] =0;
}
return 0;
}
int FindMax(int a[],int n){
int m;
int sum =0;
for(int i=0;i<n;i++){
sum +=a[i];
}
int *aux = (int *)malloc(sizeof(int)*n);
for(m =n;m>=2;m--){
if(sum%m !=0 )
continue;
memset(aux,0,sizeof(int)*n);
if(findsubsum(a,n,m,sum/m,aux,sum/m,1)){
free(aux);