拼长度问题,求高手老师给予帮助!谢谢!

蓝色小机车 2017-09-01 09:18:54
各位老师好:我是从事机械工作的,在最近工作中碰到了一个头疼的问题,所以想上论坛请教一下老师,比如实际需要线的长度是28米=2支 ,49米=3支 ,55米=4支 。实际用的整条线为115米,如何拼接所剩会最少,有这种类型的现成的计算软件吗? 谢谢指教!
...全文
187 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝色小机车 2017-09-04
  • 打赏
  • 举报
回复
谢谢,各位老师的认真详细的解释!@jianwen0529 @kugeniha @zhao4zhong1 非常感谢! 我是门外汉,不懂怎么编程,是C/C++语法是吧,谢谢~
赵4老师 2017-09-03
  • 打赏
  • 举报
回复
穷举法 “给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
kuangbao9 2017-09-02
  • 打赏
  • 举报
回复
引用 4 楼 jianwen0529 的回复:
[quote=引用 3 楼 kuangbao9 的回复:] [quote=引用 2 楼 jianwen0529 的回复:] 你这个数据量很少,遍历所有情况,选择剩余少的那种情况就可以了,很小的一个算法。
现在只有28米=2支 ,49米=3支 ,55米=4支这三种,那要是每次种类都不一样呢?这个该怎么去写一个函数遍历呢?[/quote] 一楼已经给出代码了 28米=2支 ,49米=3支 ,55米=4支 分别有3 4 5种选择(不选也是一种选择)(例如28m线,不取,取一根,取两根) 设x为记录剩余的长度,可以初始化为55或者更大(因为最佳情况不可能剩余超过或等于55m,用于后续的比较) 组合所有情况,当不满足115m需求则舍弃该种组合。当满足时,记录此种选择并跟之前比较是不是剩余更少。 最后,剩余最少的就是最佳组合了。[/quote] 我的意思是28米=2支 ,49米=3支 ,55米=4支, 66米 = 2, 56米 = 5,..............后面不知道有多少个,这个怎么设计函数
幻夢之葉 2017-09-02
  • 打赏
  • 举报
回复
ComputeMaxNumNeeded这个函数可有可无,是之前设计思路写的。 不过如今那个递归求解的函数已经间接做了ComputeMaxNumNeeded这个事情,虽然也是多了一些计算,但是影响不大
幻夢之葉 2017-09-02
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define  MAX_COUNT 100

//0记录材料规格长度,1记录总数,2记录最多需要的数量
int _material[MAX_COUNT][3] = { 0 };
int _num_material = 0;

void ComputeMaxNumNeeded(int needLength)
{
    int i, maxNum;
    for (i = 0, maxNum = 1; i < _num_material; ++i)
    {
        while (_material[i][0] * maxNum < needLength && maxNum < _material[i][1])
            ++maxNum;
        _material[i][2] = maxNum;
    }
}

int MinSurplus(int(*material)[3], int num, int needLength, int *result)
{
    int i, j;
    int len, totalLen = 0;
    int minSurplus = INT_MAX;

    // 递归结束条件
    if (num == 0)
        return 0;
    
    *result = 0; //首先设置此索引默认值
    for (i = 0; i <= (*material)[2]; ++i)
    {
        // 重置之后的索引记录项,防止之前计算45设置了但是此次却没有递归导致索引错误
        for (j = 1; j < num; ++j)
            *(result + j) = 0;

        len = (*material)[0] * i;
        // 如果还未够长度,则递归
        if (len < needLength)
            len += MinSurplus(material + 1, num - 1, needLength - len, result + 1);

        // 判断此种情况是否为最优结果,是则记录所需信息
        if (len > needLength && len - needLength < minSurplus)
        {
            *result = i;
            totalLen = len;
            minSurplus = len - needLength;
        }
    }

    return totalLen;
}

int main()
{
    int *result = 0;
    int length = 0;
    int i;

    _material[0][0] = 28;
    _material[0][1] = 2;
    _material[1][0] = 49;
    _material[1][1] = 3;
    _material[2][0] = 55;
    _material[2][1] = 4;

    _num_material = 3;

    ComputeMaxNumNeeded(115);

    result = (int *)malloc(sizeof(int)*_num_material);
    length = MinSurplus(_material, _num_material, 115, result);

    printf("%d\n", length);
    for (i = 0; i < _num_material; ++i)
        printf("%d ", result[i]);
    printf("\n");

    free(result);

    return 0;
}
幻夢之葉 2017-09-02
  • 打赏
  • 举报
回复
引用 3 楼 kuangbao9 的回复:
[quote=引用 2 楼 jianwen0529 的回复:] 你这个数据量很少,遍历所有情况,选择剩余少的那种情况就可以了,很小的一个算法。
现在只有28米=2支 ,49米=3支 ,55米=4支这三种,那要是每次种类都不一样呢?这个该怎么去写一个函数遍历呢?[/quote] 一楼已经给出代码了 28米=2支 ,49米=3支 ,55米=4支 分别有3 4 5种选择(不选也是一种选择)(例如28m线,不取,取一根,取两根) 设x为记录剩余的长度,可以初始化为55或者更大(因为最佳情况不可能剩余超过或等于55m,用于后续的比较) 组合所有情况,当不满足115m需求则舍弃该种组合。当满足时,记录此种选择并跟之前比较是不是剩余更少。 最后,剩余最少的就是最佳组合了。
kugeniha 2017-09-01
  • 打赏
  • 举报
回复
#include <stdio.h> int main() { //28米=2支 ,49米=3支 ,55米=4支 //。实际用的整条线为115 int i,j,k,min=115,p; int x,y,z; for(i=0;i<=2;i++) for(j=0;j<=3;j++) for(k=0;k<=4;k++) { p=28*i+49*j+55*k-115; if(p>=0&&p<min) { min=p; x=i;y=j;z=k; } } printf("%d %d %d min=%d\n",x,y,z,min); return 0; }
kuangbao9 2017-09-01
  • 打赏
  • 举报
回复
引用 2 楼 jianwen0529 的回复:
你这个数据量很少,遍历所有情况,选择剩余少的那种情况就可以了,很小的一个算法。
现在只有28米=2支 ,49米=3支 ,55米=4支这三种,那要是每次种类都不一样呢?这个该怎么去写一个函数遍历呢?
幻夢之葉 2017-09-01
  • 打赏
  • 举报
回复
你这个数据量很少,遍历所有情况,选择剩余少的那种情况就可以了,很小的一个算法。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧