01背包-回溯法-代码优化

具体思路为下方链接:

回溯法:0-1背包问题(C++实现)_BJM‘s blog.-CSDN博客_回溯法背包问题代码

我这里将代码进行了优化和修改,方便用户使用,只需要修改关键数据即可

代码如下:


#include <iostream>
using namespace std;

int bagCap = 165;         //背包容量大小
int weights[11] = { 0,23,31,29,44,53,38,63,85,89,82 };      //每个物品的重量
int values[11] = { 0,92,57,49,68,60,43,67,84,87,72 };       //每个物品的价值
int items[11];               //解的记录 
int packageNum = 10;        //物品的数量
int bestX[11];       //最优解;BestX[i]=1代表物品i放入背包,0代表不放入


//int weights[6] = { 0 , 12 , 7 , 11 , 8 , 9 };			
//int values[6] = { 0 , 24, 13 ,23 , 15, 16 };			
//int bagCap = 26;									 
//int items[6];					       
//int packageNum = 5;
//int bestX[6];

//bestX在找到一个叶子节点时进行约束函数的判断,满足的话就连同修改储存的最优解
int bestValue = 0;  //最优值;当前的最大价值,初始化为0


int curWeight = 0;  //当前放入背包的物品总重量
int curValue = 0;   //当前放入背包的物品总价值

void output()
{
    //cout << "最优值是:" << BestValue << endl;
    for (int i = 1; i <= packageNum; i++)
    {
        if (i == packageNum)
        {
            cout << bestX[i];
        }
        else {
            cout << bestX[i] << "->";
        }
    }
        

}
//回溯函数,参数t表示当前处在第几层做抉择,t=1时表示当前在决定是否将第一个物品放入背包
void backTrack(int t)
{
    //叶子节点,输出结果
    if (t > packageNum)
    {
        //如果找到了一个更优的解
        if (curValue > bestValue)
        {
            //保存更优的值和解
            bestValue = curValue;
            for (int i = 1; i <= packageNum; ++i)
                bestX[i] = items[i];
        }
    }
    else
    {
        //遍历当前节点的子节点:0不放入背包,1放入背包
        for (int i = 0; i <= 1; ++i)
        {
            items[t] = i;

            if (i == 0) //不放入背包
            {
                backTrack(t + 1);
            }
            else //放入背包
            {
                //约束条件:放的下
                if ((curWeight + weights[t]) <= bagCap)
                {
                    curWeight += weights[t];
                    curValue += values[t];
                    backTrack(t + 1);
                    curWeight -= weights[t];
                    curValue -= values[t];
                }
            }
        }
    }


}

int main()
{
    backTrack(1);
    output();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值