问题描述
思路
回溯法求解,解空间是一棵子集树。
算法的时间复杂度为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;//输出最优值
}