最小重量机器设计问题

问题描述:
设某一机器由n个部件组成,每一种价格都可以从m个不同的供应商处购得。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。 试设计一个算法,给出总价格不超过d的最小重量机器设计。
题目类型:回溯算法
代码如下:

/*
该题traceback(num)中num代表的是第几个部件 
*/ 
#include<stdio.h>
int n,m,d; 
int value[100][100],weight[100][100];
int best[100]={0};//最佳选择方案
int min=1000000;//最小重量 
int b[100]={0};//当前的选择方案 
int cur_weight=0;//当前总重量 
int cur_value=0;//当前总价值 
void traceback(int num)
{
    int i;
    if(num==n) { 
        if(cur_weight<min) {
            min=cur_weight; //更新最小重量 
            for(i=0;i<n;i++)
                best[i]=b[i]+1;//更新最佳选择方案,数组从0开始,输出要加1  
        }
        return ;
    }
    for(i=0;i<m;i++) { //有m个供应商可供选择
        b[num]=i;
        cur_weight+=weight[num][i];
        cur_value+=value[num][i];
        if(cur_weight<min && cur_value<=d) //等号必须加 
            traceback(num+1);
        cur_weight-=weight[num][i];
        cur_value-=value[num][i];
        b[num]=0;
    }
}

int main()
{
    int i,j;
    scanf("%d%d%d",&n,&m,&d);
    for(i=0;i<n;i++) {
        for(j=0;j<m;j++) {
            scanf("%d",&value[i][j]);
        }
    }
    for(i=0;i<n;i++) {
        for(j=0;j<m;j++) {
            scanf("%d",&weight[i][j]);
        }
    }
    traceback(0);
    printf("the min weight is %d\n",min);
    for(i=0;i<n;i++) {
        printf("%d ",best[i]);
    }
    printf("\n");
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值