问题描述:给定n种物品和一个背包。物品i的重量是wi,其价值为vi,背包的容量为C。应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大?每种物品有ni个。
问题分析:多重背包问题就是在完全背包问题的基础上增加了物品个数的限制。按照我们原来的解题思路:“首先递归遍历出所有使背包饱和(即背包中无法再放下任何一个物品)的方案,再求取背包最大价值及最佳拿取方案。”,我们首先应求出所有使背包饱和的方案。上上篇博客中我们已经求出了物品无数量限制条件下的所有背包饱和拿取方案,而现在物品增加了数量限制ni,那么我们现在要求的解一定是无数量限制的解的子集。
具体实现上,我们只需要对递归返回的条件等进行约束,即可解决多重背包问题。
直接上代码:
//给定n种物品和一个背包。物品i的重量是wi,其价值为vi,背包的容量为C。应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大?每种物品有ni个
//利用完全背包填满问题的递归函数,遍历得到所有使背包饱和的结果,求取每个方案的价值,查找最大值并输出最佳拿取方案
#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;
//int型取最小值
int Min_int(int a, int b)
{
return a > b ? b : a;
}
//int型取最大值
int Max_int(int a, int b)
{
return a > b ? a : b;
}
//打印拿取方案
void PrintVector(vector&l