冒险岛的魔法果实-多重背包
问题描述
在冒险岛的深处,小萌探索到了一个传说中的魔法果实园。这里满是各种神奇的魔法果实,吃了可以增加不同的魔法能量。
小萌想带一些魔法果实回去,但是他的背包空间有限。看着这些琳琅满目的魔法果实,小萌很是纠结,决定选择一些最有价值的果实带回去。
小萌对果园里的魔法果实进行了整理,他发现每种果实都有一颗或者多颗。他估算了下每种魔法果实能增加的魔法能量,然后开始了筛选工作:小萌有一个最大容量为 W 的背包,果园里总共有 n 种魔法果实,每种果实能增加的魔法能量为 vi,重量为 wi,每种魔法果实有 mi 颗。小萌希望在背包不超重的前提下,选择一些魔法果实装进背包,使得他们能增加的魔法能量最大。
输入格式
第一行为一个整数 n 和 W,分别表示魔法果实种数和背包的最大容量。
接下来 n 行每行三个整数 vi,wi,mi,分别表示每种果实能增加的魔法能量,重量,每种魔法果实颗数。
输出格式
输出仅一个整数,表示在背包不超重的情况下收集的魔法果实能增加的最大魔法能量。
样例输入
2 4
2 3 2
1 2 3
样例输出
2
说明
样例中,最优方案是:
第一种魔法果实 1 个,能量 2。第二种魔法果实 0 个,能量 0。最大能量为 2。
或者,第一种魔法果实 0 个,能量 0。第二种魔法果实 2 个,能量 2。最大能量为 2。
因此,最大魔法能量为 2。
评测数据规模
对于 50% 的评测数据,n≤∑mi≤104,0≤W≤103。
对于 100% 的评测数据,n≤∑mi≤105,0≤W≤4×104,1≤n≤100。
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 2s | 128M |
C | 2s | 128M |
Java | 3s | 128M |
Python3 | 4s | 128M |
PyPy3 | 4s | 128M |
Go | 4s | 128M |
JavaScript | 4s | 128M |
代码:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll MAX = 4e4 + 4;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll dp[MAX];
ll w[MAX], v[MAX], s[MAX];
int main()
{ll N, V;cin >> N >> V;for (int i = 1; i <= N; i++){cin >> v[i] >> w[i] >> s[i];}for (int i = 1; i <= N; i++){for (int j = V; j >=0; j--){for (int k = 0; k <= s[i] && k * w[i] <= j; k++){dp[j] = max(dp[j], dp[j - k * w[i]] + k * v[i]);}}}cout << dp[V] << endl;return 0;
}