/*------------完整代码@映雪-------------*/
/*初始化一组数据,省却输入,方便调试*/
#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;
}