设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。
设wij 是从供应商j 处购得的部件i的重量,cij是相应的价格。
对于给定的机器部件重量和机器部件价格,编程计算总价格不超过d的最小重量机器设计。
输入
第一行有3 个正整数n ,m和d。接下来的2n 行,每行n个数。前n行是c,后n行是w。
输出
将计算出的最小重量,以及每个部件的供应商
样例输入
3 3 4
1 2 3
3 2 1
2 2 2
1 2 3
3 2 1
2 2 2
样例输出
4
设wij 是从供应商j 处购得的部件i的重量,cij是相应的价格。
对于给定的机器部件重量和机器部件价格,编程计算总价格不超过d的最小重量机器设计。
输入
第一行有3 个正整数n ,m和d。接下来的2n 行,每行n个数。前n行是c,后n行是w。
输出
将计算出的最小重量,以及每个部件的供应商
样例输入
3 3 4
1 2 3
3 2 1
2 2 2
1 2 3
3 2 1
2 2 2
样例输出
4
1 3 1
#include<stdio.h>
int i,j;
int n = 0; // 部件数
int m = 0; // 厂商数
int d = 0; // 最大价格
int **c; // 部件 i 厂商 j 的价格
int **w; // 部件 i 厂商 j 的重量
int cT = 0; // 当前总价格
int wT = 0; // 当前总重量
int bestw; // 当前最小重量
int *bestx;
int *savex;
void backtrack(int t)
{
if(t==n-1)
{
if(cT<bestw || bestw==0)
{
bestw=cT;
for(j=0;j<n;j++)
savex[j]=bestx[j];
}
return;
}
else
{
for(j=0;j<m;j++)
{
if(cT+c[t][j]<=d)
{
cT+=c[t][j];wT+=w[t][j];bestx[t]=j+1;
backtrack(t+1);
bestx[t]=0;cT-=c[t][j];wT-=w[t][j];
}
}
}
}
int main()
{
//录入数据
scanf("%d%d%d",&n,&m,&d);
c=new int *[n];
for(i=0;i<n;i++)
c[i]=new int[m];
w=new int *[n];
for(i=0;i<n;i++)
w[i]=new int[m];
bestx = new int[m];
savex = new int[m];
for (i=0;i<n;i++)
for (j=0;j<m;j++)
scanf("%d",&c[i][j]);
for (i=0;i<n;i++)
for (j=0;j<m;j++)
scanf("%d",&w[i][j]);
backtrack(0);
printf("%d\n",bestw);
for(i=0;i<n;i++)
printf("%d ",savex[i]);
return 0;
}