回溯法解决0/1背包问题的算法,请各位大神帮忙检查一下错误

时间:2021-12-10 15:49:28
/*0/1背包问题的回溯法求解*/

#include <iostream>

using std::endl;
using std::cin;
using std::cout;

#define N 10

/*限界函数,p为当前效益总量,w为当前背包重量;k为上次去掉的物品;
M为背包容量;返回一个新的效益值*/

float Bound(float p,float w,int k,float M,float P[],float W[])
{
float b = 0.0;
float c = 0.0;
b = p;
c = w;

for(int i=k+1;i<=N;i++)
{
c = c + W[i];
if(c < M)
{
b = b + P[i];
}
else
{
return (b + (1 - (c - M)/W[i])*P[i]);
}
}
return b;


/*M是背包容量。有n种物品,其重量与效益分别存在数组W和P中;P[i]/W[i]>=P[i+1]/W[i+1]。
fw是背包的最后重量,fp是背包取得的最大效益。数组X中每个元素取0或1值。若物品k没有放入
背包,则X[k]=0;否则X[k]=1*/
void Bknap(float M,int n,float W[],float P[],float fw,float fp,int X[])
{
int k = 1;
int Y[N] = {0,0,0,0,0,0,0,0,0,0,};
float cw = 0.0f;
float cp = 0.0f;
fp = -1.0f;          //cw是背包当前重量;cp是背包当前取得的效益值

while(k <= N)
{
while(k <= n && cw + W[k] <= M)       //将物品k放入背包
{
cw = cw + W[k];
cp = cp + P[k];
Y[k] = 1;
k = k +1;
}
if(k > n)
{
fp = cp;
fw = cw;
k = n;
for(int i=1;i<=n;i++)          //修改解
{
X[i] = Y[i];
}
}
else
{
Y[k] = 0;                 //超出M,物品k不适合
}
while (Bound(cp,cw,k,M,P,W) <= fp) //上面置了fp后,Bound=fp
{
while (k != 0 && Y[k] !=1)
{
k = k -1;              //找最后放入背包的物品
}
if (k = 0)
{
return;              //算法在此处结束
}
Y[k] = 0;
cw = cw - W[k];
cp = cp - P[k];          //移掉第k项
}
k = k + 1;
}
}

void main()
{   
int n = 8;                             //物品的个数
float P[N] = {0,11,21,31,33,43,53,55,65,0}; //物品的效益值
float W[N] = {0,1,11,21,23,33,43,45,55,0};  //物品的重量
float M = 110.0f;                    //背包的最大容量
float fw = 0.0f;
float fp = 0.0f;
int X[N] = {0,0,0,0,0,0,0,0,0,0};
cout << endl
 << "输入的物品重量分别为:"
 << endl;
for(int i=1;i<=n;i++)
{
cout << W[i] << ' ';
}
cout << endl;
cout << "输入的物品效益分别为:"
 << endl;
for(int i=1;i<=n;i++)
{
cout << P[i] << ' ';
}
cout << endl;

Bknap(M,n,W,P,fw,fp,X);

cout << "该问题的最优解是:"
 << endl;
for(int i=1;i<=n;i++)
{
cout << X[i] << ' ';
}
cout << endl;
}
为什么调用完Bknap()函数后,下面的代码就不再执行了呢?

2 个解决方案

#1


肯定Bknap异常异常程序终止。

#2


由于以下错误:
while(k <= N)
Bknap陷入死循环.可能要改为:
while(k <= n)

以下这行也有问题:
for(int i=k+1;i<=N;i++)

貌似程序中还有其他问题.

#1


肯定Bknap异常异常程序终止。

#2


由于以下错误:
while(k <= N)
Bknap陷入死循环.可能要改为:
while(k <= n)

以下这行也有问题:
for(int i=k+1;i<=N;i++)

貌似程序中还有其他问题.