题目描述 为了庆贺班级在校运动会上取得全校第一名成绩,班主任决定开一场庆功会,为此拨款购买奖品犒劳运动员。期望拨款金额能购买最大价值的奖品,可以补充他们的精力和体力。
输入格式 第一行二个数n(n≤500),m(m≤6000),其中n代表希望购买的奖品的种数,m表示拨款金额。接下来n行,每行3个数,v、w、s,分别表示第I种奖品的价格、价值(价格与价值是不同的概念)和能购买的最大数量(买0件到s件均可),其中v≤100,w≤1000,s≤10。
输出格式 一行:一个数,表示此次购买能获得的最大的价值(注意!不是价格)。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
int dp[N];
int main() {
int n, V;
cin >> n >> V;
for (int i = 1; i <= n; i++) {
int v, w, s;
cin >> v >> w >> s;
if (s == -1)for (int j = V; j >= v; j--)dp[j] = max(dp[j], w + dp[j - v]);
else if (s == 0) for (int j = v; j <= V; j++)dp[j] = max(dp[j], w + dp[j - v]);
else {
int sv[20], sw[20];
int cnt = 0;
int x = 1;
while (x <= s) {
cnt++;
sv[cnt] = x * v;
sw[cnt] = x * w;
s -= x;
x *= 2;
}
if (s > 0) {
cnt++;
sv[cnt] = s * v;
sw[cnt] = s * w;
}
for (int k = 1; k <= cnt; k++)
for (int j = V; j >= sv[k]; j--)dp[j] = max(dp[j], sw[k] + dp[j - sv[k]]);
}
}
cout << dp[V];
return 0;
}
```教教我吧,我才拿了80分