题目:设某一机器由n 个部件组成,部件编号为 1~n, 每一种部件都可以从m个供应商处购得,供应商编号为1~m。设wij 是从供应商j 处购得的部件i的重量, cij 是相应的价格。对于给定的机器部件重量和机器部件价格,计算总价格不超过cost 的最小重量机器设计,可以在同一个供应商处购得多个部件。
输入:第1 行输入3 个整数n、m、cost,接下来n行输入Wij ( 每行m个整数),最后η行输入Cij (每行m个整数),这里1<=n、m<=100 。
输出描述: 输出的第1行包括n个整数,表示每个对应的供应商编号,第2行为对应的重量。
输入:
3 3 7
1 2 3
3 2 1
2 3 2
1 2 3
5 4 2
2 1 2
输出样例:
1 3 1
4
#include<iostream>
using namespace std;
int n, m, d;
int bestw = 0x3f3f3f3f;
int w[101][101];
int c[101][101];
int cw, cv;
int x[101];
int y[101];
void BackTrack(int t)
{
if(t > n)
{
if(cv <= d && cw < bestw)
{
bestw = cw;
for(int i = 1; i <= n; i ++)
x[i] = y[i];
}
}
else
{
for(int j = 1; j <= m; j ++)
{
if(w[t][j] + cw <= d)
{
y[t] = j;
cw += w[t][j];
cv += c[t][j];
BackTrack(t + 1); // 回溯
cw -= w[t][j];
cv -= c[t][j];
}
}
}
}
int main()
{
scanf("%d %d %d", &n, &m, &d);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
scanf("%d", &w[i][j]);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
scanf("%d", &c[i][j]);
BackTrack(1);
for(int i = 1; i <= n; i ++)
{
printf("%d", x[i]);
if(i != n)printf(" ");
}
puts("");
printf("%d", bestw);
return 0;
}