牛牛选物题解

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;
    }
};
全部评论

相关推荐

废物一个0offer:认真的吗二本本科找人工智能岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务