回溯法-经典 01背包问题

【算法】 专栏收录该内容
46 篇文章 0 订阅

经典问题:

给定N中物品和一个背包。物品i的重量是Wi,其价值位Vi ,背包的容量为C。问应该如何选择装入背包的物品,使得转入背包的物品的总价值为最大??

分析

这里写图片描述

1、如上图碰到一组数据,有两种可能:选或者不选,在树种分别由1,0表示。

2、使用递归,在遍历完n个数的时候,判断最终的数是否比最佳价值大,如果比最佳价值大,就把值赋给bestv。

代码:

#include<stdio.h>

int c=30;    //背包容量
int n=3;    //对象数目
int w[]={20,15,15};  //对象重量数组
int v[]={40,25,25};  //对象收益数组
int cw;   //当前背包重量
int cv;   //当前背包价值
int bestv;//迄今最大的收益
int X[n];  //记录在树中的移动路径,为1的时候表示选择该组数据,为0的表示不选择该组数据

void getBest(int i)
{
    if(i>=n)//递归结束的判定条件
    {
        if(cv>bestv)
            bestv=cv;

        return;
    }
    if(cw+w[i]<=c)//进入该节点的右孩子(值为1的孩子)
    {
        X[i]=1;
        cw+=w[i];
        cv+=v[i];
        getBest(i+1);
        cw-=w[i];//此处回溯
        cv-=v[i];
    }

    X[i]=0;//进入该节点的右孩子(值为0的孩子)
    getBest(i+1);
}

int main()
{

    getBest(0);
    printf("%d",bestv);

    return 0;
}



  • 13
    点赞
  • 5
    评论
  • 29
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值