牛客巅峰赛S2钻石&王者场A题-牛牛选物

链接:https://ac.nowcoder.com/acm/contest/9887/A
来源:牛客网

牛牛有现在有n个物品,每个物品有一个体积v[i]和重量g[i],他想选择其中总体积恰好为V的若干个物品,想使这若干个物品的总重量最大,他想知道最大总重量为多少。(如果不存在合法方案,返回-1)

对于100%的数据,1≤n≤20,1≤v[i]≤1e8,1≤g[i]≤1e8,1≤V≤1e9

给定三个参数,第一个参数为数组v,第二个参数为数组g,第三个参数为体积V,求最大总重量为多少。

(所给字符串与返回字符串都不带引号)

思路:

根据数据范围,n小于20,二进制搜索,n个物品00000....000-11111...1111,可以用2^n表示每一组二进制数代表唯一一种状态,找到这些状态中满足体积为V的,在维持一个重量最大值gmax

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回总体积为V若干物品的最大总重量,如果g存在选择若干物品总体积为V的情况,返回-1
     * @param v int整型vector 
     * @param g int整型vector 
     * @param V int整型 
     * @return int整型
     */
    int Maximumweight(vector<int>& v, vector<int>& g, int V) {
        // write code here
        //二进制枚举
        int n = v.size(), gmax = -1;
        for(int i = 0; i < 1<< n; ++i){
            int p = i, j = 0, vsum = 0, gsum = 0;
            while(p > 0){
                vsum += p%2 * v[j];//p = 1 或0
                gsum += p%2 * g[j];
                j++;
                p /= 2;
            }
            if(vsum == V)
                gmax = max(gmax, gsum);
        }
        return gmax;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给你一颗小瓜子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值