/*最小重量机器问题*/
#include<stdio.h>
int w[100][100]; //w[i][j]为第i个零件在第j个供应商的重量
int c[100][100]; //c[i][j]为第i个零件在第j个供应商的价格
int bestx[100]; //bestx[i]表示一次搜索到底后的最优解,用来存放第i个零件的供应商,
int x[100]; //x[i]临时存放第i个零件的供应商
int cw=0,cc=0,bestw=10000;
int cost; //限定价格
int n; //部件数
int m; //供应商数
void Backtrack(int t)
{
int j;
if(t>n) //搜索到叶子结点,一个搜索结束,所有零件已经找完
{
bestw=cw; //当前最小重量
for(j=1;j<=n;j++)
bestx[j]=x[j];
}
else
{
for(j=1;j<=m;j++)
{
if(cc+c[t][j]<=cost && cw+w[t][j]<bestw)
{
x[t]=j;
cc+=c[t][j];
cw+=w[t][j];
Backtrack(t+1);
cc-=c[t][j];
cw-=w[t][j];
}
}
}
}
int main()
{
int i,j;
printf("请输入部件数:\n");
scanf("%d",&n);
printf("请输入供应商数:\n");
scanf("%d",&m);
printf("请输入限定价格:\n");
scanf("%d",&cost);
printf("请输入各部件在不同供应商的重量:\n");
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
scanf("%d",&w[i][j]);
printf("请输入各部件在不同供应商的价格:\n");
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
scanf("%d",&c[i][j]);
Backtrack(1);
printf("每个部件的供应商:\n");
for(i=1;i<=n;i++)
printf("%d ",bestx[i]);
printf("\n");
printf("所有部件的最小重量:\n");
printf("%d ",bestw);
printf("\n");
return 0;
}