0-1背包回溯法求解

问题描述

在这里插入图片描述

思路

回溯法求解,解空间是一棵子集树。
算法的时间复杂度为O(2n)

代码

#include <iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<math.h>
int bestv=0;//存放最优值
int cv=0;//当前背包的价值量
int cw=0;//当前背包的重量
int v[101];//存放物品价值量数组
int w[101];//存放物品重量数组
int x[101];//存放当前解
int bestx[101];//存放最优解
//回溯法 解空间是一个二叉树 递归回溯
void getbestv(int i,int n,int c)
{
    if(i>n){//递归出口,到了叶子节点以后了
        //如果当前背包价值量cv大于最优值bestv,更新最优值,最优解
        if(cv>bestv){
            bestv=cv;
            for(int k=1;k<=n;k++)//更新最优解
                bestx[k]=x[k];
        }
        return ;//递归出口
    }
    //子集树,j=0或者j=1两种条件求解
    for(int j=0;j<=1;j++){
        x[i]=j;//x[i]=0,x[i]=1两种情况都遍历
        if(cw+w[i]<=c){
            //更新当前背包重量,当前背包价值
            cw=cw+x[i]*w[i];
            cv=cv+x[i]*v[i];
            //子集树向下寻找
            getbestv(i+1,n,c);
            //还原背包重量,背包价值
            cw=cw-x[i]*w[i];
            cv=cv-x[i]*v[i];
        }
    }
    return ;
}
int main()
{
    int c;//表示背包的容量
    cin>>c;
    int n;//表示有n个物品
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>w[i];
    for(int i=1;i<=n;i++)
        cin>>v[i];
    getbestv(1,n,c);
    cout<<bestv;//输出最优值
    
}
发布了97 篇原创文章 · 获赞 101 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/practical_sharp/article/details/102773611