链接: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;
}
};