1.回溯法编程求解0-1背包问题
#include<stdio.h>
#include<iostream>
using namespace std;
int c,n;
int cv=0,cw=0,mv=0,mw=0;
int weight[20],value[20];
int x[20],bestv[20];
int backtrack(int t)
{
int i;
if(t>n)//回溯结束
{
if(cv>mv)
{
mv=cv;
for(i=0;i<n;i++) bestv[i]=x[i];
}
}
else
{
for(i=0;i<=1;i++)
{
x[t]=i;
if(x[t]==0)
{
backtrack(t+1);
x[t]=0;
}
else if((cw+weight[t]<=c)&&x[t]==1)
{
cv=cv+value[t];
cw=cw+weight[t];
backtrack(t+1);
x[t]=0;
cv=cv-value[t];
cw=cw-weight[t];
}
}
}
return 0;
}
int main()
{
int i;
cout<<"背包容量:";
cin>>c;
cout<<"物品个数:";
cin>>n;
cout<<"各物品重量:";
for(i=0;i<n;i++)
cin>>weight[i];
cout<<"各物品价值:";
for(i=0;i<n;i++)
cin>>value[i];
backtrack(0);
printf("回溯法得出物品为");
for(i=0;i<n;i++)
printf("%d ",bestv[i]);
cout<<endl<<"最大价值为:"<<endl<<mv;
system("pause");
return 0;
}
2.利用回溯法编程求解TSP问题
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[100][100];
int x[100];
int best [100] = {0};
int bestp = 10000;
int thistp = 0;
//记录当前正在计算路径的费用
void TSP(int t){
if(t>n){
if((a[x[n]][1])&&(a[x[n]][1]+thistp<bestp)){
bestp = a[x[n]][1]+ thistp;
for(int i = 1;i<=n;i++){
best [i] = x[i];
}
}
}else{
for(int i = t;i<=n;i++){
if((a[x[t-1]][x[i]])&&( thistp +a[x[t-1]][x[i]]<bestp)){
swap(x[t],x[i]);
thistp +=a[x[t-1]][x[t]];
TSP(t+1);
thistp -=a[x[t-1]][x[t]];
swap(x[t],x[i]);
}
}
}
}
int main(){
cout<<"输入城市个数:"<<endl;
cin>>n;
for(int i = 1;i<=n;i++){
x[i] = i;
}
cout<<"输入城市之间的距离(0表示城市间不通):"<<endl;
for(int i = 1;i<=n;i++){
for(int j = 1;j<=n;j++){
cin>>a[i][j];
}
}
TSP(2);
cout<<"最少旅行费用为: "<<bestp<<endl;
cout<<"旅行路径为:"<<endl;
for(int i = 1;i<=n;i++){
cout<<best [i]<<" ";
}
cout<<best [1]<<endl;
system("pause");
return 0;
}