/*------------完整代码@映雪-------------*/ /*初始化一组数据,省却输入,方便调试*/ #include <iostream> using namespace std; typedef struct { int value[5];/*价值表*/ int weight[5];/*重量表*/ int num;/*数量*/ int limitw;/*最大重量*/ int select[5]; }Goods; int maxvalue=0,totalvalue=115;//方案最大价值,物品总价值 int select1[5]={0};/*全局*/ void backpack(Goods &g, int i, int tw, int tv)//参数为物品i,当前选择已经达到的重量和tw,本方案可能达到的总价值 { int k; if (tw + g.weight[i] <= g.limitw)//将物品i包含在当前方案,且重量小于等于限制重量 { select1[i] = 1; //选中第i个物品 if (i < g.num - 1) //若物品i不是最后一个物品 backpack(g, i + 1, tw + g.weight[i], tv); //递归调用,继续添加下一物品 else //若已到最后一个物品 { for (k = 0; k < g.num; ++k) //将状态标志复制到option数组中 g.select[k] = select1[k]; maxvalue = tv; //保存当前方案的最大价值 } } select1[i] = 0; //取消物品i的选择状态 if (tv - g.value[i] > maxvalue)//若物品总价值减去物品i的价值还大于maxv方案中已有的价值,说明还可以继续向方案中添加物品 { if (i < g.num - 1) //若物品i不是最后一个物品 backpack(g, i + 1, tw, tv - g.value[i]); //递归调用,继续加入下一物品 else //若已到最后一个物品 { for (k = 0; k < g.num; ++k) //将状态标志复制到option数组中 { g.select[k] = select1[k]; } maxvalue = tv - g.value[i]; //保存当前方案的最大价值(从物品总价值中减去物品i的价值) } } } int main() { int sumweight=0; Goods g={{40,12,7,8,48},{5,2,1,1,6},5,8,{0}};/*初始化一组数据*/ cout<<"背包最大能装的重量为:"<<g.limitw<<endl; for (int i = 0; i < g.num; i++) cout<<"第"<<i+1<<"号物品重"<<g.weight[i]<<" "<<"价值为:"<<g.value[i]<<endl; backpack(g,0,0,totalvalue); cout<<"计算结果为:"<<endl; for (i = 0; i < g.num; ++i) if (g.select[i]) { cout<<"第"<<i+1<<"号物品重"<<g.weight[i]<<" "<<"价值为:"<<g.value[i]<<endl; sumweight+=g.weight[i]; } cout<<"总重量为:"<<sumweight<< "总价值为:"<<maxvalue<<endl; return 0; }
时间: 2024-10-17 14:17:27