【编程题目】一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值★★ (自己没有做出来!!)...

本文介绍了一种算法,用于解决将整数数组分成多个子数组的问题,目标是找到能够使得所有子数组和相等的最大分组数量。通过具体实例展示了如何实现这一算法,并提供了完整的C语言代码。

45.雅虎(运算、矩阵):

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

 

回头再自己写!!

 

 网上答案,验证正确。http://blog.youkuaiyun.com/peng_weida/article/details/7741888

/*
45.雅虎(运算、矩阵):
2.一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值
比如{3,2,4,3,6}  可以分成{3,2,4,3,6} m=1; 
{3,6}{2,4,3} m=2  
21
{3,3}{2,4}{6} m=3  所以 m 的最大值为 3
*/

#include <cstdio>
#include <cstdlib>

#define NUM    7

int maxShares(int a[], int n);

//aux[i]的值表示数组a中第i个元素分在哪个组,值为0表示未分配
//当前处理的组的现有和 + goal的值 = groupsum
int testShares(int a[], int n, int m, int sum, int groupsum, int aux[], int goal, int groupId);

int main()
{
    int a[] = {8, 4, 3, 3, 2, 2, 2}; 
        //{2,2,2,3,3,4,8} ;
        //{1,2,2,3,4,6}; 
        //{2, 6, 4, 1, 3, 9, 7, 5, 8, 10};

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

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

    system("pause");
    return 0;
}

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

        aux[i] = 0;                //a[i]分配失败,将其置为未分配状态
    }

    return 0;
}
int maxShares(int a[], int n)
{
    int sum = 0;
    int *aux = (int *)malloc(sizeof(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 (testShares(a, n, m, sum, sum/m, aux, sum/m, 1))
        {
            //打印分组情况
            printf("\n分组情况:");
            for (int i = 0; i < NUM; i++)
                printf(" %d ", aux[i]);

            free(aux);
            aux = NULL;
            return m;
        }
    }

    free(aux);
    aux = NULL;
    return 1;
}

 

### 使用C语言实现5个整数最大值 #### 方法描述 在C语言中,可以通过循环结构条件判断语句轻松实现寻找一组整数中的最大值。下面提供一种基于数组的方法来解决问题。 --- #### 完整代码示例 ```c #include <stdio.h> int main() { int arr[5]; // 创建一个长度为5的数组用于存储输入的整数 printf("请输入5个整数:\n"); for (int i = 0; i < 5; i++) { // 循环读取用户输入的5个整数 scanf("%d", &arr[i]); } int max = arr[0]; // 初始化最大值为第一个元素 for (int i = 1; i < 5; i++) { // 遍历剩余的4个元素 if (max < arr[i]) { // 如果发现更大的数,则更新最大值 max = arr[i]; } } printf("这五个整数中的最大值是:%d\n", max); // 输出结果 return 0; } ``` --- #### 代码解析 1. **初始化阶段**:定义了一个大小为5的整型数组 `arr` 来接收用户的输入,并通过 `scanf()` 函数逐一获取这些数值[^6]。 2. **设定初始最大值**:将数组的第一个元素设为初步的最大值候选者 `max = arr[0]`。 3. **迭代比较**:采用 `for` 循环从第二个元素开始逐步与当前记录的最大值对比。一旦遇到比现有最大值还要大的新值就立即取代旧的最大值位置上的内容[^7]。 4. **输出最终结果**:经过一轮完整的扫描之后,变量 `max` 将会保存整个集合里的最高数值,最后将其打印出来供查看。 --- #### 测试样例 假定用户依次键入以下五组测试数据: - 输入:`1 2 3 4 5` → 输出:`5` - 输入:`-5 -4 -3 -2 -1` → 输出:`-1` - 输入:`10 20 30 40 50` → 输出:`50` - 输入:`5 5 5 5 5` → 输出:`5` (全相等情况) - 输入:`0 100 -100 50 200` → 输出:`200` 以上情况均可正确返回对应的最大值。 --- ### 总结 上述方法简单高效地解决了题目所提出的“找出五个整数中的最大值”的需。该算法的时间复杂度仅为O(n),非常适合处理此类小型问题集的情况[^8]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值