描述
小鹿在洞穴内发现了王室的宝物,小鹿对洞穴里的宝物进行了整理,她发现每样宝物都有一件或者多件。他粗略估算了下每样宝物的价值,之后开始了宝物筛选工作:
小鹿有一个最大载重为 m 的采集车,洞穴里总共有 n 种宝物,每种宝物的价值为 vi,重量为 wi,每种宝物有 si 件。小鹿希望在采集车不超载的前提下,选择一些宝物装进采集车,使得它们的价值和最大。
输入描述
第一行为一个整数 n 和 m,分别表示宝物种数和采集车的最大载重( 0≤m≤3×103 )。
接下来 n 行每行三个整数 vi,wi,si ( n≤∑si≤ 105)。
输出描述
输出仅一个整数,表示在采集车不超载的情况下收集的宝物的最大价值。
#include<bits/stdc++.h>
using namespace std;
long long n , m , w , v , s , dp[114514];
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
cin>>n>>m;
for(long long i = 0;i < n;i++){
cin>>v>>w>>s;
for(long long count = 1;s > 0;count*=2){
int num = min(count,s);
int W = num*w;
int V = num*v;
//wbyas zyabxfacd
for(long long j = m;j >= W;j--){
dp[j] = max(dp[j],dp[j-W]+V);
}
s-=num;
}
}
cout<<dp[m];
return 0;
}