最小重量机器设计问题

设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设 w i j 是从供应商j处购得的部件 i 的重量, c i j 是相应的价格。

试设计一个算法,给出总价格不超过 c 的最小重量机器设计。

数据输入:由文件input.txt输入

数据输出:output.txt

#include<stdio.h>


int n,m,d;
int cw=0;//当前重量 
int cp=0;//当前价格 
int sum=0;//选择机器的重量、最优重量、选择第一个厂的部件
int bestx[100];//保存选择的工厂
int bestj[100];
int c[100][100],w[100][100];//输入数据 


int main()
{
FILE *fp1,*fp2;
fp1 = fopen("input.txt","r");
fp2 = fopen("output.txt","w");
 
fscanf(fp1,"%d %d %d",&n,&m,&d);//输入参数 
 


for(int i=0;i<n;i++){ //输入数据 
for(int j=0;j<m;j++){
fscanf(fp1,"%d ",&c[i][j]);

}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
fscanf(fp1,"%d ",&w[i][j]);

}
sum+=w[i][0];
}

printf("%d %d %d\n",n,m,d);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d ",c[i][j]);
}
printf("\n");
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d ",w[i][j]);
}
printf("\n");
}
void BackStack(int i);
BackStack(0);//调用函数 
printf("%d\n",sum);
fprintf(fp2,"%d\n",sum);
for(int i=0;i<n;i++){
printf("%d ",bestj[i]);
fprintf(fp2,"%d ",bestj[i]);

}


void BackStack(int i){
if(i>n){
if(cw<sum){
sum=cw;//更新最小重量
for(i=0;i<n;i++){ //方案保存在best数组里 
bestj[i]=bestx[i]+1;//当出现更小的方案时,更新选择的方案 

}
return ; 
   
}
for(int j=0;j<m;j++){//有m个厂商选择 
bestx[i]=j;//用来标记厂商 
cw=cw+w[i][j];//左子树 
cp=cp+c[i][j];
if(cw<sum&&cp<=d){
BackStack(i+1);
}
cw=cw-w[i][j];//右子树 回溯 
cp=cp-c[i][j];
printf("%d\n",sum);
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值