回溯法

0-1背包

问题:给定n种物品和一背包。物品i的重量是wi,其价值为pi,背包的容量为C。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
        分析:问题是n个物品中选择部分物品,可知,问题的解空间是子集树。比如物品数目n=3时,其解空间树如下图,边为1代表选择该物品,边为0代表不选择该物品。使用x[i]表示物品i是否放入背包,x[i]=0表示不放,x[i]=1表示放入。回溯搜索过程,如果来到了叶子节点,表示一条搜索路径结束,如果该路径上存在更优的解,则保存下来。如果不是叶子节点,是中点的节点(如B),就遍历其子节点(D和E),如果子节点满足剪枝条件,就继续回溯搜索子节点。

 

#include<iostream>
using namespace std;
#define N 3
#define C 16
int weight[N]={10,8,5};
int value[N]={5,4,1};
int flag[N]={0,0,0};

int CurrentWight=0;
int CurrentValue=0;

int MaxValue=0;
int bestValue[N];
void backtrace(int x)
{
    if(x>N-1)
    {
        if(CurrentValue>MaxValue){
            MaxValue=CurrentValue;
            for(int i=0;i<N;i++)
                bestValue[i]=flag[i];
        }        
    }
    else
    {
        for(int i=0;i<=1;i++)
        {
            flag[x]=i;
            if(i==0)
            {
                backtrace(x+1);
            }
            else
            {
                if(CurrentWight+weight[x]<=C)
                {
                    CurrentWight+=weight[x];
                    CurrentValue+=value[x];
                    backtrace(x+1);
                    CurrentWight-=weight[x];
                    CurrentValue-=value[x];
                }
            }
        }
    }
}
int main()
{
    backtrace(0);
    cout<<"MaxValue:"<<MaxValue<<endl;
    for(int i=0;i<N;i++)
    {
        cout<< bestValue[i]<<" ";
    } 
    cout<<endl;
    return 0;
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值