多重背包简介
题目描述:
给出N个物品(一个物品可以选择0~a个),背包最大承重为M,每个物品有一个重量w,一个价值v,一个个数a。如何选择才能在重量不超过M的情况下,使选择的物品的价值总和最大。
输入格式:
第一行:是两个正整数N,M。
第2 ~ (n + 1)行:每行三个正整数w,v和a。
输出格式:
一个整数,为最大价值总和是多少。
输入样例:
4 20
9 3 3
9 5 1
4 9 2
1 8 3
输出样例:
47
暴力解法
我们发现多重背包和零一背包十分相像,只不过多重背包中,每个物品可以选0 ~ a个。这会让我们想到,直接把第i个物品,拆成a[i]个重量都为w[i],价格也都为v[i]的物品不就行了吗,接下来一个经典的零一背包就可以搞定了。
注:如果你还没学过零一背包,可以去此网址先学习一下https://blog.youkuaiyun.com/SkeletonKing233/article/details/94893608
(PS:NR是指物品个数的上限,MR是指重量的上限)
# include <cstdio>
# include <iostream>
# include <algorithm>
# include <cmath>
# include <cstring>
using namespace std;
# define FOR(i, a, b) for(int i = a; i <= b; i++)
# define _FOR(i, a, b) for(int i = a; i >= b; i--)
const int NR = 100000, MR = 100000000;
int n, m