征服代码 2024-04-22 11:32 采纳率: 83.3%
浏览 28

最小重量机器设计问题

设某一机器由n个部件组成,每一种部件都可以从 m个不同的供应商处购得。设w,是从供应商j处购得的部件i的重量,cg是相应的价格。
试设计一个算法,给出总价格不超过c的最小重量机器设计。
★编程任务:
对于给定的机器部件重量和机器部件价格,编程计算总价格不超过d的最小重量机器设计。
★数据输入:
由文件input.txt给出输入数据。第一行有3个正整数n,m和d。接下来的2n行,每行n个数。前n行是c,后n行是w。
★结果输出:
将计算的最小重量,以及每个部件的供应商

#include<stdio.h>
#include<stdlib.h>
int n,m,d;//设置静态变量,在主函数给他赋值之后,其他函数访问无需传参
int array1[1000][1000],array2[1000][1000];
int cp=0,cw=0;
int bestw=10000;
int x[100],x1[100];

void machine(int t){
    if(t>=n){
        if(cw<bestw)
            bestw=cw;
        for(int i=0;i<n;i++)
            x1[i]=x[i];
        return ;
    }
    for(int i=0;i<m;i++)
    {
        cp+=array1[t][i];
        cw+=array2[t][i];
        x[t]=i;
        if(cp<=d&&cw<=bestw)
            machine(t+1);
        cp-=array1[t][i];
        cw-=array2[t][i];
    }
    
}


int main(){
    scanf("%d %d %d",&n,&m,&d);
    for(int i=0;i<n;i++)
    {for(int j=0;j<m;j++)
    scanf("%d",&array1[i][j]);
    }
    for(int i=0;i<n;i++)
    {for(int j=0;j<m;j++)
        scanf("%d",&array2[i][j]);
    }
    machine(0);
    printf("%d ",bestw);
    for(int i=0;i<n;i++){
        
        printf("%d ",x1[i]+1);
    }
    return 0;
}

请问为什么计算结果错误

  • 写回答

6条回答 默认 最新

  • 阿里嘎多学长 2024-04-22 11:32
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    问题概括

    这个问题是关于设计一个算法,旨在从多个供应商中选择部件,以构建一个总价格不超过特定限额(d)的机器,同时保证机器的总重量最小。

    问题出现原因

    根据提供的代码和问题描述,可能的问题原因包括:

    1. 数组越界:如果n的值大于1000,那么array1array2数组将越界。
    2. 变量初始化:变量cpcw可能没有正确初始化,导致计算时出现错误。
    3. 逻辑错误machine函数的递归逻辑可能存在问题,导致无法正确计算最小重量。
    4. 输入处理:输入数据的处理可能存在问题,比如价格和重量的读取顺序或者格式不正确。
    5. 输出处理:输出时,x1数组的值可能没有正确地从x数组中复制过来。

    问题解决方案

    为了解决这个问题,我们需要:

    1. 确保数组大小足够大,以避免越界。
    2. 正确初始化所有变量。
    3. 修正递归逻辑,确保它能够正确地计算最小重量。
    4. 确保输入数据正确读取。
    5. 在输出之前,确保x1数组正确地从x数组中复制。

    提供示例

    以下是修改后的代码示例:

    #include <stdio.h>
    #include <stdlib.h>
    
    int n, m, d; // 设置静态变量
    int array1[1001][1001], array2[1001][1001]; // 确保数组大小足够
    int bestw = 10000;
    int x[1001], x1[1001];
    
    void machine(int t) {
        if (t == n) {
            if (cw < bestw) {
                bestw = cw;
                for (int i = 0; i < n; i++) {
                    x1[i] = x[i];
                }
            }
            return;
        }
        int minWeight = 10000, minCost = 0;
        for (int i = 0; i < m; i++) {
            int cp = array1[t][i];
            int cw = array2[t][i];
            x[t] = i;
            if (cp <= d) { // 确保当前部件的价格不超过总价格限制
                machine(t + 1);
            }
        }
    }
    
    int main() {
        scanf("%d %d %d", &n, &m, &d);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                scanf("%d", &array1[i][j]);
                scanf("%d", &array2[i][j]);
            }
        }
        machine(0);
        printf("%d ", bestw);
        for (int i = 0; i < n; i++) {
            printf("%d ", x1[i] + 1); // 输出供应商编号,加1是因为题目要求从1开始编号
        }
        return 0;
    }
    

    示例代码运行方式

    1. 将上述代码保存为.c文件,例如machine_design.c
    2. 使用C语言编译器编译代码,例如使用gcc:gcc machine_design.c -o machine_design
    3. 运行编译后的程序,并将输入数据重定向到程序:./machine_design < input.txt

    示例代码预期运行结果

    假设input.txt包含正确的输入数据,程序将输出最小重量和每个部件的供应商编号。例如:

    2000 1 2 3
    

    表示最小重量为2000,部件1由供应商1提供,部件2由供应商2提供,部件3由供应商3提供。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月22日

悬赏问题

  • ¥15 微信小程序跳转关联公众号
  • ¥15 Java AES 算法 加密采用24位向量报错如何处理?
  • ¥15 使用X11可以找到托盘句柄,监控到窗口点击事件但是如何在监听的同时获取托盘中应用的上下文菜单句柄
  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
  • ¥15 QT+FFmpeg使用GPU加速解码
  • ¥15 为什么投影机用酷喵播放电影放一段时间就播放不下去了?提示发生未知故障,有什么解决办法吗?
  • ¥15 来个会搭建付费网站的有偿
  • ¥100 有能够实现人机模式的c/c++代码,有图片背景等,能够直接进行游戏
  • ¥15 以AT89C51单片机芯片为核心来制作一个简易计算器,外部由4*4矩阵键盘和一个LCD1602字符型液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。