设某一机器由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);
}
}