01背包-回溯算法

本文详细介绍了01背包问题的一个具体实例,其中背包容量为50,共有3种物品可供选择。通过展示物品的重量与价值,文章进一步解释了如何使用回溯算法来求解最优解,以最大化背包中物品的总价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01背包问题

背包容量:50

物品数量:3

n                 1                        2                     3

重量       10                        30                    20

价值        60                       120                 100


回溯算法如下:

#define NUM 100
int c;                                       //背包容量
int n;                                       //物品数量
int cw;                                      //当前重量
int cv;                                      //当前价值
int bestv;                                   //当前最优价值

struct Object
{
    int w;                                   //重量
    int v;                                   //价值
    double d;                                //单位重量价值比

}Q[NUM];                                     //物品数组

bool cmp(Object a, Object b)
{
    if(a.d>=b.d)return true;
    else return false;
}

for (int i=0; in){bestv = cv;return;}                          //到达叶子结点,更新最优值
    if(cw + Q[i].w<=c)                                     //进入左子树搜索
    {
        cw += Q[i].w;
        cv += Q[i].v;
        backtrack(i+1);
        cw -= Q[i].w;
        cv -= Q[i].v;
    }
    if(Bound (i+1)>bestv)backtrack(i+1);                   //进入右子树搜索
}

//限界函数Bound的实现
int Bound(int i)
{
    int cleft = c-cw;                                      //背包剩余容量
    int b = cv;                                            //上界
    while (i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值