关闭

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

1715人阅读 评论(0) 收藏 举报
45.雅虎(运算、矩阵):
1.对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)
某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。
最大流
2.一个整数数组,长度为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<iostream>
using namespace std ;
//o(n!)全排列
int testShares(int a[], int n, int m, int sum, int groupsum, int aux[], int goal, int groupId) {
if (goal == 0) {
groupId++;
goal=groupsum;
if (groupId == m+1) return 1;
}
for (int i=0; i<n; i++) {
if (aux[i] != 0) continue;
aux[i] = groupId;
if (testShares(a, n, m, sum, groupsum, aux, goal-a[i], groupId)) {
return 1;
}
aux[i] = 0;
}
return 0;
}
int maxShares(int a[], int n) {
int sum = 0;
int i, m;
int *aux=new int[n];
for (i=0; i<n; i++) sum += a[i];
for (m=n; m>=2; m--) {
if (sum%m != 0) 
continue;
for (i=0; i<n; i++) 
aux[i] = 0;
if (testShares(a, n, m, sum, sum/m, aux, sum/m, 1))
{
for (i=0; i<n; i++) 
cout<<aux[i]<<" ";
return m;
}
}
return 0;
}




int main()
{
int a[]={5,4,2,2,1};
cout<<maxShares(a,5);
return 1;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:78364次
    • 积分:1365
    • 等级:
    • 排名:千里之外
    • 原创:58篇
    • 转载:9篇
    • 译文:0篇
    • 评论:13条
    文章分类
    最新评论