01背包-回溯算法

来源:互联网 发布:佳能戴尔超六淘宝 编辑:程序博客网 时间:2024/05/22 15:42

01背包问题

背包容量:50

物品数量:3

n                 1                        2                     3

重量       10                        30                    20

价值        60                       120                 100


回溯算法如下:

#define NUM 100int 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

原创粉丝点击