65,186
社区成员




#include <iostream>
#include <iomanip>
using namespace std;
struct DEF_node {
int i,flag,par;
float cp,cw;
};
int w[]={0,1,2,3,4,5}; //重量
int p[]={0,3,9,2,5,7}; //价值
int n=5; //物品个数
int m=8; //背包容量
void algm(int,int);
main() {
algm(n,m);
}
struct DEF_node enode,node,q[100]; //enode为当前扩展结点,node为 enode的子结点
void algm(int n,int m) {
int f=0,e=0; //队首、队尾指针
int bestp=0,beste=0;
enode.cw=0; //初始化第1层
enode.cp=0;
enode.i=0;
enode.flag=0;
enode.par=0;
e++;
q[e]=enode;
while (e!=0) { //e=0子集空间树搜索完毕
node.cw=enode.cw+w[enode.i+1];
if (node.cw<=m) { //检查左孩子。可行的左孩子,取物品i
node.cp=enode.cp+p[enode.i+1];
if (node.cp>bestp) {
bestp=node.cp;
beste=e+1;
}
node.flag=1;
node.par=f;
node.i=enode.i+1;
e++;
q[e]=node;
}
node.cw=enode.cw; //搜索右孩子,不取物品i
node.cp=enode.cp;
node.flag=0;
node.par=f;
node.i=enode.i+1;
e++;
q[e]=node;
f++; //取下一个E-结点
enode=q[f];
}
for (int j=1; j>=n; j++) { //输出最大利润方案之一
if (q[beste].flag==1)
cout<<"choose"<<q[beste].i<<" ";
beste=q[beste].par;
}
cout<<"Max="<<bestp<<endl;
}