牛牛选物题解
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; } };