每日学习一算法【4】01背包问题

  • 回溯法: 01背包问题,用回溯法需要构造解的子集树以寻找最优解。只要左子节点是可一个可行结点,搜索就进入其左子树。对于右子树时,先计算上界函数,以判断是否将其减去。

  • 上界函数: 当前价值 + 剩余容量可容纳的最大价值。

详细代码下载链接

//回溯函数
void backtrack(int i)
{
    if(i>n)//结束条件
    {
        bestp = cp;
        return;
    }
    if(cw+w[i]<=c)//能放就放进去(左子树)
    {
        cw+=w[i];
        cp+=v[i];
        backtrack(i+1);//递归
        cw-=w[i];//恢复到不放入状态
        cp-=v[i];
    }
    if(bound(i+1)>bestp)//右子树
        backtrack(i+1);
}
//上界函数
double bound(int i)
{
    double lw= c-cw;
    double bd = cp;
    while(i<=n && w[i]<=lw)
    {
        lw-=w[i];
        bd+=v[i];
        i++;
    }
    if(i<=n)
        bd+=v[i]/w[i]*lw;
    return bd;  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值