【题目来源】
https://www.acwing.com/problem/content/4/
【题目描述】
有 N 种物品和一个容量是 V 的背包。
第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。
【输入格式】
第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。
接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。
【输出格式】
输出一个整数,表示最大价值。
【数据范围】
0
【算法分析】
背包问题,求解的是“将
多重背包问题,每种物品有有限多个;
完全背包问题,每种物品有无限多个;
0-1背包问题,每种物品只有一个。
由于本题给出的多重背包问题的问题规模不大,所以可以用“暴力拆分”的方法,将原多重背包问题中的第 i 种物品视为只有一个的某种物品,这样就可将多重背包问题转化为0-1背包问题。示意图如下所示:

切记,“暴力拆分”的方法只适用于问题规模不大的多重背包问题。若问题规模较大,必然会TLE。因此,对于问题规模较大的多重背包问题,就需要进行二进制优化。
实例详见:https://blog.csdn.net/hnjzsyjyj/article/details/109363826
【算法代码】
- #include
- using namespace std;
-
- const int maxn=105;
- int c[maxn];
-
- int val,vol,type;
-
- main() {
- int n,V;
- cin>>n>>V;
- for(int k=1;k<=n;k++) {
- cin>>vol>>val>>type;
- for(int i=1; i<=type; i++)
- for(int j=V; j>=vol; j--)
- c[j]=max(c[j],c[j-vol]+val);
- }
- cout<
-
- return 0;
- }
-
- /*
- in:
- 4 5
- 1 2 3
- 2 4 1
- 3 4 3
- 4 5 2
- out:
- 10
- */
【参考文献】
https://www.acwing.com/problem/content/4/
https://blog.csdn.net/hnjzsyjyj/article/details/109363826