有一个人前来买瓜(C++语言)

军训这么累,当然要吃瓜啦。

有一个小军前来买瓜。

众所周知,YHW水果摊里的西瓜的瓜皮子和瓜粒子都是金粒子做的。小军当然想获得尽可能多的金粒子。

一共有n个瓜,每个瓜有重量w,成熟度v,金粒子数量g。

虽然小军的钱是无限的,但他的电动车载重是有限的,因此他不能买总重量超过W的瓜。

"我开水果摊的,能卖给你生瓜蛋子? ——YHW

因此,当小军买的瓜的总成熟度小于V时,YHW并不会把瓜卖给他。

具体的:水果摊一共有n个瓜,每个瓜有重量w,成熟度v,金粒子数量g。一共有q次询问,每次询问给出两个值W、V,小军要选取n个瓜的子集,使总重量 Σw≤W,总成熟度Σv≥V,求 Σg
的最大值。

Input
第一行输入两个整数,q(1≤n≤100,1≤q≤100),代表瓜的数量和询问数量。

接下来n行,每行三个整数,第i行的三个整数 i,vi,gi(1≤wi,vi,gi≤100),分别代表第i个瓜的重量,成熟度和价值。

接下来q行,输入两个整数,V(1≤W,V≤500),代表一组询问。

Output
输出一共有q行,每行一个整数,分别代表每组询问的最大金粒子数总和,若无合法的买法则输出-1。


样例

输入(1)

5 1
2 4 5
4 3 3
1 3 2
3 4 3
3 2 5
10 10

输出(1)

15

代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Melon {
    int weight;
    int maturity;
    int gold;
};

int main() {
    int n, q;
    cin >> n >> q;

    vector<Melon> melons(n);
    for (int i = 0; i < n; i++) {
        cin >> melons[i].weight >> melons[i].maturity >> melons[i].gold;
    }

    // Initialize a dynamic programming table
    vector<vector<long long>> dp(501, vector<long long>(501, -1));
    dp[0][0] = 0;

    // Fill in the DP table
    for (int i = 0; i < n; i++) {
        for (int j = 500; j >= 0; j--) {
            for (int k = 500; k >= 0; k--) {
                if (dp[j][k] >= 0 && j + melons[i].weight <= 500) {
                    dp[j + melons[i].weight][min(k + melons[i].maturity, 500)] =
                        max(dp[j][k] + melons[i].gold, dp[j + melons[i].weight][min(k + melons[i].maturity, 500)]);
                }
            }
        }
    }

    while (q--) {
        int W, V;
        cin >> W >> V;
        long long result = -1;

        // Find the maximum gold for the given constraints
        for (int j = 0; j <= W; j++) {
            for (int k = V; k <= 500; k++) {
                result = max(result, dp[j][k]);
            }
        }
        cout << result << endl;
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值