C++回溯法实例1
最小重量机器设计问题:设某一机器由n个部件组成,每一个部件都可以从m个不同的供应商处购买,设wij是从供应商j处购得的部件i的重量,cij为相应得价格。试设计一个算法,给出总价格不超过c的最小重量机器设计。#include <iostream.h>
int a[100],b[100],e[100],n,cl,c[100][100],w[100][100],weight, cheap,low,jiage;//b[100]为出售商数量数组
void cheaplow(int i,int j);
void jianzhi()
{
if(weight>low)
{
weight=low;
jiage=cheap;
for(int k=1;k<=n;k++)//记录路径
e[k]=a[k];
}
for(int i=n;i>0;i--)//回溯
if(a
{
cheap-=c
low-=w
cheaplow(i,a
}
else
{
cheap-=c
low-=w
}
}
void cheaplow(int i,int j)
{
if(cheap+c
{
if(j<b
else if(i>0)
{//寻找可以符合条件的节点
for(int k=i-1;k>-1;k--)
if(a[k]<b[k])
{
cheap-=c[k][a[k]];
low-=w[k][a[k]];
cheaplow(k,a[k]+1);
}
else
{
cheap-=c[k][a[k]];
low-=w[k][a[k]];
}
}
}
else
{
a
cheap+=c
low+=w
if(i<n)
{
cheaplow(i+1,1);
cheap-=c
low-=w
}
else jianzhi();
}
}
void main()
{
int j;
cout<<"请输入零件个数:";
cin>>n;
cout<<"请输入限定钱数:";
cin>>cl;
for(int k=1;k<=n;k++)
{
cout<<"请输入第"<<k<<"号零件出售商个数:";
cin>>j;
b[k]=j;
for(int l=1;l<=j;l++)
{
cout<<"请输入第"<<k<<"号零件价格"<<l<<":";
cin>>c[k][l];
cout<<"请输入第"<<k<<"号零件重量"<<l<<":";
cin>>w[k][l];
weight+=w[k][l];
jiage+=c[k][l];
}//初始的重量和价格都为所有输入之和
}
cheaplow(1,1);
if(jiage<=cl)
{
cout<<"价格为"<<jiage<<"时,最轻重量为"<<weight<<endl;
for(int x=1;x<=n;x++)
cout<<"零件"<<x<<"在出售商"<<e[x]<<"处购买."<<endl;
}
else cout<<"无法找到合适的购买方案!"<<endl;
}