违规紫衫
  • 板块灌水区
  • 楼主scy_SWDAR
  • 当前回复14
  • 已保存回复14
  • 发布时间2024/12/8 21:21
  • 上次更新2024/12/9 15:57:10
查看原帖
违规紫衫
1106235
scy_SWDAR楼主2024/12/8 21:21

题目描述 为了庆贺班级在校运动会上取得全校第一名成绩,班主任决定开一场庆功会,为此拨款购买奖品犒劳运动员。期望拨款金额能购买最大价值的奖品,可以补充他们的精力和体力。

输入格式 第一行二个数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
2024/12/8 21:21
加载中...