求解最小机器重量设计问题
题目内容:
设某一机器由n个部件组成,部件编号为1~n,每一种部件都可以从m个不同的供应商处购得,供应商编号为1~m。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。对于给定的机器部件重量和机器部件价格,计算总价格不超过d的最小重量机器设计。(注意:输出结果中第一行最后没有空格。比如下面的输出样例中1 3 1后面没有空格。)
输入格式:
第1行输入3个正整数n,m和d。接下来n行输入wij(每行m个整数),最后n行输入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 = 03f3f3f3f; // 设置一位最大值
int w[101][101]; // 对应的两个分别存储重量和价格的二维数组
int c[101][101];
int cw, cv; // 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;
}