回溯法求解最小重量机问题
描述
设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wiy是从供应商j 处购得的部件i的重量,ciy是相应的价格。试设计一个算法,给出总价格不超过c的最小重量机器设计。
对于给定的机器部件重量和机器部件价格,编程计算总价格不超过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
bool backtrack(int i) // 搜索到第i个零件
{
if(i>n)
按算法特征 ,此时解为最优;
return true;
else
bool found=false;
if(当前最优解<d)
found=true;
for(j=1;j<=m;j++) //考虑每一个供应商供应i零件的情况
{
更新总重量;
更新总价格;
if(价格<=d, 总量<目前最优解)
if( backtrack(i+1))
return ture;
还原重量;
还原价格;
}
return found;
}
算法优化:
在考虑供应商时,设置mark[][]数组;
若对于某一件产品, 对于某一供应商来讲,存在价格和重量都占优势的其他供应商,那么在回溯时此供应商不予考虑