小弟最近刚刚C++,对下面这个代码程序不很很懂,想请教一下这个算法的思路,最好能把这个算法在解决背包问题上的优缺点。希望大神帮帮忙,感激不尽。
回溯算法代码:
#include "iostream.h"
#include "conio.h"
#include "math.h"
#define N 7
struct object
{
float w;
float p;
float v;
}ob[N+1];
void sort(void);void main()
{
int i,k,w_cur,w_est,x[N+1],y[N+1],M;
float p_cur,p_total,p_est;
cout<<"请输入背包容量M:\n";
cin>>M;
cout<<"请输入物品的重量和价值:\n";
for(i=0;i<N;i++)//输入物品的重量和价值并计算其价值重量比
{
cout<<"NO."<<i+1<<endl;
cin>>ob[i].w>>ob[i].p;
ob[i].v=ob[i].p/ob[i].w;
}
for(i=0;i<=N;i++)
{
x[i]=0;
y[i]=0;
}
sort();//对物品按照价值重量比排序
w_cur=0; p_cur=0; p_total=0; k=0;
while(k>=0)
{
w_est=w_cur;
p_est=p_cur;
for(i=k;i<N;i++)//使用贪心法求背包问题的解
{
w_est+=ob[i].w;
if(w_est<M) p_est+=ob[i].p;
else
{
p_est+=((M-w_est+ob[i].w)/ob[i].w)*ob[i].p;
break;
}
}
if(p_est>p_total)//不需要回溯
{
for (i=k;i<N;i++)
{
if (w_cur+ob[i].w<=M)
{
w_cur = w_cur + ob[i].w;
p_cur = p_cur + ob[i].p;
y[i] = 1;
}
else
{
y[i] = 0; break;
}
}
if (i>=N)
{
if (p_cur>p_total)
{
p_total = p_cur;
k = N;
for (i=0;i<N;i++) x[i] = y[i];
}
}
else k = i + 1;
}
else //回溯
{
while ((i>=0)&&(y[i]==0))
i=i-1;
if (i<0) break;
else
{
w_cur = w_cur - ob[i].w;
p_cur = p_cur - ob[i].p;
y[i] = 0;
k = i + 1;
}
}
}
k=1;
for(i=0;i<N;i++)//输出
if(x[i]!=0)
{
cout<<"No "<<k<<"物品重量为:"<<ob[i].w<<"价值为:"<<ob[i].p<<endl;
k++;
}
cout<<p_total;
getch();
}
void sort(void)
{
int i,j;
struct object temp;
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
if(ob[j].v>ob[i].v)
{
temp=ob[i];
ob[i]=ob[j];
ob[j]=temp;
}
}
回溯算法代码:
#include "iostream.h"
#include "conio.h"
#include "math.h"
#define N 7
struct object
{
float w;
float p;
float v;
}ob[N+1];
void sort(void);void main()
{
int i,k,w_cur,w_est,x[N+1],y[N+1],M;
float p_cur,p_total,p_est;
cout<<"请输入背包容量M:\n";
cin>>M;
cout<<"请输入物品的重量和价值:\n";
for(i=0;i<N;i++)//输入物品的重量和价值并计算其价值重量比
{
cout<<"NO."<<i+1<<endl;
cin>>ob[i].w>>ob[i].p;
ob[i].v=ob[i].p/ob[i].w;
}
for(i=0;i<=N;i++)
{
x[i]=0;
y[i]=0;
}
sort();//对物品按照价值重量比排序
w_cur=0; p_cur=0; p_total=0; k=0;
while(k>=0)
{
w_est=w_cur;
p_est=p_cur;
for(i=k;i<N;i++)//使用贪心法求背包问题的解
{
w_est+=ob[i].w;
if(w_est<M) p_est+=ob[i].p;
else
{
p_est+=((M-w_est+ob[i].w)/ob[i].w)*ob[i].p;
break;
}
}
if(p_est>p_total)//不需要回溯
{
for (i=k;i<N;i++)
{
if (w_cur+ob[i].w<=M)
{
w_cur = w_cur + ob[i].w;
p_cur = p_cur + ob[i].p;
y[i] = 1;
}
else
{
y[i] = 0; break;
}
}
if (i>=N)
{
if (p_cur>p_total)
{
p_total = p_cur;
k = N;
for (i=0;i<N;i++) x[i] = y[i];
}
}
else k = i + 1;
}
else //回溯
{
while ((i>=0)&&(y[i]==0))
i=i-1;
if (i<0) break;
else
{
w_cur = w_cur - ob[i].w;
p_cur = p_cur - ob[i].p;
y[i] = 0;
k = i + 1;
}
}
}
k=1;
for(i=0;i<N;i++)//输出
if(x[i]!=0)
{
cout<<"No "<<k<<"物品重量为:"<<ob[i].w<<"价值为:"<<ob[i].p<<endl;
k++;
}
cout<<p_total;
getch();
}
void sort(void)
{
int i,j;
struct object temp;
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
if(ob[j].v>ob[i].v)
{
temp=ob[i];
ob[i]=ob[j];
ob[j]=temp;
}
}
还有后面的if(p_est>p_total)//不需要回溯
{
for (i=k;i<N;i++)
{
if (w_cur+ob[i].w<=M)
{
w_cur = w_cur + ob[i].w;
p_cur = p_cur + ob[i].p;
y[i] = 1;
}
else
{
y[i] = 0; break;
}
}
if (i>=N)
{
if (p_cur>p_total)
{
p_total = p_cur;
k = N;
for (i=0;i<N;i++) x[i] = y[i];
}
}
else k = i + 1;
}
else //回溯
这是构造回溯的解空间还是直接找最优解了?