`
阿尔萨斯
  • 浏览: 4168652 次
社区版块
存档分类
最新评论

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

 
阅读更多

一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
比如{32436} 可以分成{32436} m=1;
{3,6}{2,4,3} m=2
{3,3}{2,4}{6} m=3
所以m的最大值为3

#include <iostream>
using namespace std;


int testShare(int *a,int n,int m,int sum,int groupSum,int *aux,int goal,int groupId)
{
	if(goal < 0)
		return 0;

	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(testShare(a,n,m,sum,groupSum,aux,goal-a[i],groupId))
			return 1;

		//如果不适合恢复
		aux[i] = 0;
	}
	return 0;
}

int maxShare(int *a,int n)
{
	int sum = 0;
	
	int *aux = new int[n];

	for(int i = 0;i<n;i++)
		sum+=a[i];

	for(int m = n;m>=2;m--)
	{
		if(sum%m!=0)
			continue;

		for(int i = 0;i < n;i++)
		{
			aux[i] = 0;
		}

		if(testShare(a,n,m,sum,sum/m,aux,sum/m,1))
		{
			//打印分组情况
			cout << endl<<"分组情况"<<endl;
			for(int i = 0;i< n;i++)
				cout << aux[i]<<" ";
			delete[] aux;
			aux = NULL;
			return m;
		}
	}
	
}

int main()
{
	int a[] = {3,2,4,3,6};

	//打印数组值
	printf("数组的值:");
	for (int i = 0; i < 5; i++)
		printf(" %d ", a[i]);

	printf("\n可以分配的最大组数为:%d\n", maxShare(a, 5));

	system("pause");
	return 0;
}


分享到:
评论

相关推荐

    python求最大子段和(动态规划法)

    【问题描述】使用分治递归算法解最大子段和问题,具体来说就是,将序列分为长度相等的左右两段,分别求出这两段的最大子段和,包含左右部分子段的最大子段和,求这三种情况得到的最大子段和的最大值。 【输入形式】...

    汇编语言 20个练习题目 代码加实验报告

    5.15 数据段中已定义了一个有N个字数据的数组M,试编写一程序求出M中绝对值最大的数,把它放在数据段的M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中。 5.16 在首地址为DATA的字数组中,存放了100H个16位...

    (剑指offer)面试题14- I. 剪绳子

    给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n&gt;1并且m&gt;1),每段绳子的长度记为 k[0],k[1]…k[m] 。请问 k[0]k[1]…*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成...

    世界500强面试题.pdf

    1.6.3. 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数 位于数组的后半部分 ...........................................................130 1.6.4. 给定链表的头指针和一个...

    python求最大子段和(分冶递归法)

    【问题描述】使用分治递归算法解最大子段和问题,具体来说就是,将序列分为长度相等的左右两段,分别求出这两段的最大子段和,包含左右部分子段的最大子段和,求这三种情况得到的最大子段和的最大值。 【输入形式】...

    上海电机学院C语言实训答案

    输入一个正整数n (1&lt;n),再输入n 个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n 个数。 (25)抓住肇事者 一辆卡车违反交通规则,撞人后逃跑。现场共有三个目击者,但都没有记住车号...

    计算机二级公共基础知识

    对于完全二叉树来说,叶子结点只可能在层次最大的两层上出现:对于任何一个结点,若其右分支下的子孙结点的最大层次为p,则其左分支下的子孙结点的最大层次或为p,或为p+1。 完全二叉树具有以下两个性质: 性质1:...

    javascript文档

    isNaN 方法 返回一个 Boolean 值,表明某个值是否为保留值 NaN(不是一个数)。 isPrototypeOf 方法 返回一个 Boolean 值,表明对象是否存在与另一对象的原型链中。 italics 方法 将 HTML的 &lt;I&gt; 标识添加到 String...

    微软JavaScript手册

    isNaN 方法 返回一个 Boolean 值,表明某个值是否为保留值 NaN(不是一个数)。 isPrototypeOf 方法 返回一个 Boolean 值,表明对象是否存在与另一对象的原型链中。 italics 方法 将 HTML的 &lt;I&gt; 标识添加到 String...

    JScript 语言参考

    isNaN 方法 返回一个 Boolean 值,表明某个值是否为保留值 NaN(不是一个数)。 isPrototypeOf 方法 返回一个 Boolean 值,表明对象是否存在与另一对象的原型链中。 italics 方法 将 HTML的 &lt;I&gt; 标识添加到 String...

    北交大Python期末测验

    回文数判断:设N是一任意自然数,如果N的各位数字反向排列所得自然数与N相等,那么N就是一个回文数。从键盘输入一个数字,判断这个数字是不是回文数 题6. 输入一句英文英语,求其中最长的单词长度 ...... 题19. ...

    数据结构(C++)有关练习题

    D. *建立函数create:根据一维数组a[n]建立一个单链表,使单链表中各元素的次序与a[n]中各元素的次序相同,要求该程序的时间复杂度为O(n)。 E. *整理函数tideup:在非递减有序的单链表中删除值相同的多余...

    《数据结构 1800题》

    《数据结构 1800题》 第一章 绪论 一、选择题 1. 算法的计算量的大小称为计算的(B )。【北京邮电大学2000 二、3 (20/8分)】 A.效率 B....2. 算法的时间复杂度取决...10. 若将数据结构定义为一个二元组(D,R),...

    数据结构实验

    1.任意输入队列长度和队列中的元素值,构造一个顺序循环队列,对其进行清空、插入新元素、返回队头元素以及删除队头元素操作。 2.约瑟夫环的实现:设有n个人围坐在圆桌周围,现从某个位置 i 上的人开始报数,数到 ...

    最新JAVA编程题全集_50题及答案

    写一个函数,例如:给你的 a b c 则输出 abc acb bac bca cab cba import java.util.ArrayList; import java.util.List; public class NumTest { public static void main(String[] args) { String s="ABCD";...

    VBSCRIPT中文手册

    IsNumeric 函数 返回 Boolean 值,表示表达式能否当作一个数,用来计算。 IsObject 函数 返回 Boolean 值,表示表达式是否引用了有效的“自动”对象。 Join 函数 返回连接许多包含在一个数组中的子串而创建的字符...

    vb Script参考文档

    IsNumeric 函数 返回 Boolean 值,表示表达式能否当作一个数,用来计算。 IsObject 函数 返回 Boolean 值,表示表达式是否引用了有效的“自动”对象。 Join 函数 返回连接许多包含在一个数组中的子串而创建的字符...

    VBScript 语言参考

    IsNumeric 函数 返回 Boolean 值,表示表达式能否当作一个数,用来计算。 IsObject 函数 返回 Boolean 值,表示表达式是否引用了有效的“自动”对象。 Join 函数 返回连接许多包含在一个数组中的子串而创建的字符...

Global site tag (gtag.js) - Google Analytics