问题描述:
设n个物品的编号为0~n-1,重量和价值分别用数组w【】与v【】存放,背包限制重量用W表示,X【】存放最优解,x【i】的值为0、1分别表示物品i不在、在背包内。
求解:
物品选择实际上就是一棵完全二叉树,左孩子对应选择当前物品,右孩子对应不选择。父节点的值对应当前选择下总的重量以及物品值,如图。

树的深搜其实就是先序、中序或者后续当中的一种,而回溯则是在此基础上,在某条函数自我调用语句的后面加上与上一步相反操作的语句,具体来看代码。
代码:
i代表当前物品编号,n代表物品总数,W代表背包限制重量,w【】和v【】分别存储对应标号物品的重量与价值,tw和tv代表当前节点的重量与价值,temp【】用来存储当前选择完成后的结果,x【】用来存放最优解,maxv作为选择最优解的指标。
#include<stdio.h>
#include<iostream>
using namespace std;
#define max 10
void dfs(int i, int n, int W, int* w, int* v, int tw
背包问题回溯法求解

本文介绍了一种使用回溯法解决背包问题的方法。通过构造一棵完全二叉树来表示物品的选择情况,并利用递归进行搜索。文章提供了一个具体的C++实现案例,展示了如何寻找最优解。
最低0.47元/天 解锁文章
1823





