牛牛选物题解
100分解法
典型的二进制枚举,只需要枚举每个物品选与不选即可,下面给出两种写法,一种是用dfs的,一种是不用的。时间复杂度o(n*2^n),空间复杂度非递归o(n),递归空间复杂度为o(2^n)。代码如下:
(ps:本题还有时间度更低的方法:折半搜索,可以把分成两半分别处理,然后有第一个集合所有的体积x在第二个集合二分查找对应V-x体积的数,然后更新,令m=n/2,这种做法时间复杂度为o(m*2^m*log(m^2)),因为本题n很小所以没有必要使用这种较麻烦的做法,故本做法不附代码)
非递归代码
class Solution {
public:
/**
* 返回总体积为V若干物品的最大总重量,如果我存在选择若干物品总体积为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 maxn=-1;
int n=v.size();
for(int i=1; i<(1<<n); i++)
{
int sum=0;
int sum2=0;
for(int j=0; j<n; j++)
{
if(i&(1<<j))
{
sum+=v[j];
sum2+=g[j];
}
}
if(sum==V)
{
maxn=max(maxn,sum2);
}
}
return maxn;
}
};递归代码
int n;
int maxn=-1;
vector<int >vv;
vector<int >gg;
class Solution {
public:
/**
* 返回总体积为V若干物品的最大总重量,如果我存在选择若干物品总体积为V的情况,返回-1
* @param v int整型vector
* @param g int整型vector
* @param V int整型
* @return int整型
*/
void dfs(int x,int sum1,int sum2,int V)
{
if(n==x)
{
if(sum1==V)maxn=max(maxn,sum2);
return ;
}
if(vv[x]+sum1<=V)dfs(x+1,sum1+vv[x],sum2+gg[x],V);
dfs(x+1,sum1,sum2,V);
}
int Maximumweight(vector<int>& v, vector<int>& g, int V) {
// write code here
vv=v;gg=g;
n=v.size();
dfs(0,0,0,V);
return maxn;
}
};