钢材切割问题

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45573057 已知钢材的总长,订单数和各订单需要的长度编制程序从订单中选择一组订单对钢材作切割加工, 使得钢材得到最佳应用,约定,每次切割损耗固定长度的钢材。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/45573057

已知钢材的总长,订单数和各订单需要的长度编制程序从订单中选择一组订单对钢材作切割加工, 使得钢材得到最佳应用,约定,每次切割损耗固定长度的钢材。

下面写一下我的思路,刚开始没有想明白应该怎么使用递归去做,但是,看了他们的代码之后,走了一遍,才明白,其实思路不太好想,但是实现起来还是比较容易的。

假设,我们有一段钢材,长度为12米,其中有3个订单,分别需要的长度为5,6,9米,每次切割总会有2米的损耗,求得其最佳订单组合。

现在我们想想一下我们正常的思路:
如果是只有一个订单的话,9米的订单是最合适的,加上2米的耗材,一共11米。

如果有两个订单的话,有组合5,6;5,9;6,9这三个组合,很明显,这三个组合都已经超过了12米的长度,因为如果是5,6的话,虽然说订单的和为11,但是有两次切割,还会有4米的耗材,加起来就是15米,已经远远超过钢材的长度了

由上面的可以知道,3个订单的组合那就更不行了。

那我们应该如何做到实现这个思路呢,我们有一个数组记录订单是否选中,请看下面这张图:

这里写图片描述

5,6,9初始化的时候,全是未选中的状态,程序开始执行,先选中5,加上损耗的长度小于12,则继续选中6,这样加上损耗的长度大于12了,则设置6的状态为未选中;接着选中9,5加上9加上损耗的长度,很明显超过12了,那么设置9的状态为未选中;接着从5开始的遍历完成了,将5的状态设置为未选中;选中6,再从5开始选中,这样进行下去。。。。

当然,中间需要有两个变量记录最佳长度和最佳订单组合。

下面附上我的代码:

#include <stdio.h>

/**
 * 已知钢材的总长,订单数和各订单需要的长度
 * 编制程序从订单中选择一组订单对钢材作切割加工,
 * 使得钢材得到最佳应用,约定,每次切割损耗
 * 固定长度的钢材
 */

#define N 20
#define DELTA 2 //切割钢材损耗

/** 最好的长度 **/
int bestlen;

/** 最好长度的选定订单 **/
int bestsele[N];

/** 选定订单,用于尝试选择 **/
int sele[N];

/** 有n的订单 **/
int n;

/** 订单需要的钢材的长度 **/
int orderlen[N];

/** 钢材总长度 **/
int total;

void attempt();

int main(void)
{
    int j;

    //获取钢材的总长度
    printf("Please enter the length of the steel:\n");
    scanf("%d",&total);

    //获取钢材的订单数
    printf("Please enter the number of the orders:\n");
    scanf("%d",&n);

    //获取各个订单数需要的长度
    printf("Please enter the length of every order:\n");
    for(j = 0;j < n;j++)
        scanf("%d",&orderlen[j]);

    //初始化工作,使所有的订单都没有被选中
    for(j = 0;j < n;j++)
        bestsele[j] = sele[j] = 0;

    //初始化最佳长度,设置为0
    bestlen = 0;

    //获取最佳长度
    attempt();

    printf("order:\n");
    for(j = 0;j < n;j++){
        if(bestsele[j])
            printf("%d\t",orderlen[j]);
    }
    printf("\nlength:\n%d",bestlen);

    return 0;
}

void attempt(){
    int i,len;

    //获取选中的订单的总长度(加上损耗)
    for(len = i = 0;i < n;i++)
        if(sele[i])
            len += (orderlen[i]+DELTA);

    if(len-DELTA <= total){  //注意,最后一个订单可能不需要损耗
        if(bestlen < len){
            bestlen = len;

            for(i = 0;i < n;i++)
                bestsele[i] = sele[i];
        }

        //每次尝试选择订单之后,需要将其还原未选中状态
        for(i = 0;i < n;i++){
            if(!sele[i]){
                sele[i] = 1;
                attempt();
                sele[i] = 0;
            }

        }
    }
}
目录
相关文章
|
9天前
|
机器人 API 调度
基于 DMS Dify+Notebook+Airflow 实现 Agent 的一站式开发
本文提出“DMS Dify + Notebook + Airflow”三位一体架构,解决 Dify 在代码执行与定时调度上的局限。通过 Notebook 扩展 Python 环境,Airflow实现任务调度,构建可扩展、可运维的企业级智能 Agent 系统,提升大模型应用的工程化能力。
|
人工智能 前端开发 API
前端接入通义千问(Qwen)API:5 分钟实现你的 AI 问答助手
本文介绍如何在5分钟内通过前端接入通义千问(Qwen)API,快速打造一个AI问答助手。涵盖API配置、界面设计、流式响应、历史管理、错误重试等核心功能,并提供安全与性能优化建议,助你轻松集成智能对话能力到前端应用中。
681 154
|
15天前
|
人工智能 数据可视化 Java
Spring AI Alibaba、Dify、LangGraph 与 LangChain 综合对比分析报告
本报告对比Spring AI Alibaba、Dify、LangGraph与LangChain四大AI开发框架,涵盖架构、性能、生态及适用场景。数据截至2025年10月,基于公开资料分析,实际发展可能随技术演进调整。
957 152
|
负载均衡 Java 微服务
OpenFeign:让微服务调用像本地方法一样简单
OpenFeign是Spring Cloud中声明式微服务调用组件,通过接口注解简化远程调用,支持负载均衡、服务发现、熔断降级、自定义拦截器与编解码,提升微服务间通信开发效率与系统稳定性。
358 156
|
7天前
|
分布式计算 监控 API
DMS Airflow:企业级数据工作流编排平台的专业实践
DMS Airflow 是基于 Apache Airflow 构建的企业级数据工作流编排平台,通过深度集成阿里云 DMS(Data Management Service)系统的各项能力,为数据团队提供了强大的工作流调度、监控和管理能力。本文将从 Airflow 的高级编排能力、DMS 集成的特殊能力,以及 DMS Airflow 的使用示例三个方面,全面介绍 DMS Airflow 的技术架构与实践应用。
|
8天前
|
人工智能 自然语言处理 前端开发
Qoder全栈开发实战指南:开启AI驱动的下一代编程范式
Qoder是阿里巴巴于2025年发布的AI编程平台,首创“智能代理式编程”,支持自然语言驱动的全栈开发。通过仓库级理解、多智能体协同与云端沙箱执行,实现从需求到上线的端到端自动化,大幅提升研发效率,重塑程序员角色,引领AI原生开发新范式。
469 2