宝物筛选(混合背包)
前言:请读者在已知01背包、完全背包的推导过程,且有一定的DP基础的前提下,再来阅读本文,效果更佳。
题意:
小FF找到了N件宝物,每一件都有它的价值、重量、数量,小FF当然想全部拿走,但它有一个拉跨的 手推车,只能承受M的重量。求在重量不超过M的前提下,拿到的宝物价值最大!!!
输入:
第一行为N、M,接下来的N行为每一件宝物的价值、重量、数量。
输出:
最大价值!!!
思路:
大家应该都能看出来是一个混合背包:即集01背包、完全背包、多重背包于一身的杂交体,这类问题我们的普遍做法如下,但这个做法有一个很大的缺点:太慢了。
//我把这个做法称为:分类讨论法
#include<iostream>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
using namespace std;
int n,m,f[50000];
int main()
{
cin >> n >> m;
for(int i = 1,w,c,p;i <= n;++i)
{
cin >> c >> w >> p;
if(p == 1)//01背包
{
for(int j = m;j >= w;--j)
{
f