0-1背包实属经典问题,经典的解决方法有动态规划算法,我用简单易理解的递归解答,主要代码如下。
注意:对递归过程中不必要的代码进行剪枝提高效率。
//DFS
//0-1背包,递归法
const int bmaxn = 30;
//背包容量,最大价值
int n,maxCapacity,maxValue = 0;
int weight[bmaxn],value[bmaxn];
void bag(int index,int Vsum,int Wsum){
if(index == n){
//更新背包重量,递归结束条件
if(Wsum <= maxCapacity&&Vsum >= maxValue)
maxValue = Vsum;
return;
}
//找下一个物品,且不要
bag(index+1,Vsum,Wsum);
//找下一个物品,要了
//为了提高算法效率,我们要过滤不必要的递归
//不光没超重
if(Wsum + weight[index] <= maxCapacity){
//还得增值才行,增值的话修改总值
if(maxValue < Vsum+value[index]){
maxValue = Vsum + value[index];
}
bag(index+1,Vsum+value[index],Wsum+weight[index]);
}
}
//input 0-1 bag data
void inputbag(){
printf("输入物品数,背包容量:\n");
scanf("%d%d",&n,&maxCapacity);
printf("输入各物品重量:\n");
for(int i = 0;i<n;i++){
scanf("%d",&weight[i]);
}
printf("输入各物品价值:\n");
for(int i = 0;i<n;i++){
scanf("%d",&value[i]);
}
}