【算法笔记】回溯法——01背包问题

版权声明:本文为博主原创文章,如需转载,请注明出处: https://blog.csdn.net/MASILEJFOAISEGJIAE/article/details/54755806

【算法笔记】回溯法——01背包问题

#include<iostream>
using namespace std;
#define N 1000

int n;         //物品数量
int c;         //背包总容量
int left_c;         //背包剩余容量

int v[N];      //物品价值
int w[N];      //物品重量

int x[N];      //记录结果的选择情况
int best[N];    //记录最优解

int cur_v;    //当前价值
int max_v = 0;  //保存当前最大价值


void backtrack(int t){     //只有装得下第t个物品,才装t-------1
    if(t > n){     //到达叶节点
        if(cur_v > max_v){
            max_v = cur_v;
        }
        return;
    }

    if(left_c >= w[t]){   //装得下第t个物品,装t-------1
        x[t] = 1;
        left_c -= w[t];
        cur_v += v[t];
        backtrack(t + 1);   //递归,选择第t+1个物品

        /*递归完了之后要恢复*/
        left_c += w[t];
        cur_v -= v[t];
    }

    x[t] = 0;          //不装t -------0
    backtrack(t + 1);    //递归,选择第t+1个物品
}



int main(){
    cin>> n >> c;
    left_c = c;
    cur_v = 0;

    for(int i = 1; i <= n; i++){
        cin>>v[i];
    }

    for(int i = 1; i <= n; i++){
        cin>>w[i];
    }

    backtrack(1);
    cout<<max_v;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/MASILEJFOAISEGJIAE/article/details/54755806
今日推荐