1661.最小重量机

该问题描述了一个关于机器部件设计的优化问题,目标是在不超过特定成本的前提下,找出总重量最小的机器部件组合。输入包含部件数量、供应商数量和成本上限,以及各部件在不同供应商处的重量和价格。通过递归算法寻找最优解,输出最优部件的供应商编号及其对应重量,以及最低总重量。
摘要由CSDN通过智能技术生成

1661.最小重量机
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
设某一机器由n个部件组成,部件编号为1n,每一种部件都可以从m个供应商处购得,供应商编号为1m。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。对于给定的机器部件重量和机器部件价格,计算总价格不超过cost的最小重量机
器设计,可以在同一个供应商处购得多个部件。

输入
第1行输入3个整数n、m、cost,接下来n行输入wij(每行m个整数),最后n行输入cij(每行m个整数),这里1≤n、m≤100。

输出
输出的第1行包括n个整数,表示每个对应的供应商编号,第2行为对应的重量。

输入样例
3 3 7
1 2 3
3 2 1
2 3 2
1 2 3
5 4 2
2 1 2

输出样例
1 3 1
4

提示
行尾无空格

#include <stdio.h>
#include <stdlib.h>

void GetData(int n,int m);
void Machine(int k);
void PrintRes(int n);

typedef struct {
    int SellerWeight[100];
    int SellerPrice[100];
}Component;

Component cpt[100];
int Num_Comp,Num_Sell,MaxCost;  //零件个数/销售商个数/cost上限
int TMPSelectedSeller[100];
int SelectedSeller[100];
int Lowest_wi=100000;
int Cur_cost=0,Cur_weight=0;

int main(void){
    scanf("%d %d %d",&Num_Comp,&Num_Sell,&MaxCost);
    GetData(Num_Comp,Num_Sell);
    Machine(1);
    PrintRes(Num_Comp);
    return 0;
}

void Machine(int k){
    if(k>Num_Comp){
        if(Cur_weight<Lowest_wi){
            Lowest_wi=Cur_weight;
            for(int i=1;i<=Num_Comp;i++){
                SelectedSeller[i]=TMPSelectedSeller[i];
            }
        }
    }
    else{
        for(int i=1;i<=Num_Sell;i++){
            Cur_cost+=cpt[k].SellerPrice[i];
            Cur_weight+=cpt[k].SellerWeight[i];
            TMPSelectedSeller[k]=i;
            if(Cur_cost<=MaxCost && Cur_weight<=Lowest_wi){
                 Machine(k+1);
            }
            Cur_cost-=cpt[k].SellerPrice[i];
            Cur_weight-=cpt[k].SellerWeight[i];
        }
    }
}

void GetData(int n,int m){
    int i=1,j=1;
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            scanf("%d",&cpt[i].SellerWeight[j]);
        }
    }

    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            scanf("%d",&cpt[i].SellerPrice[j]);
        }
    }
}
void PrintRes(int n){
    for(int i=1;i<=n-1;i++){
        printf("%d ",SelectedSeller[i]);
    }
    printf("%d\n",SelectedSeller[i]);
    printf("%d\n",Lowest_wi);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值