首页 > 试题广场 >

牛牛选物

[编程题]牛牛选物
  • 热度指数:271 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
现在有n个物品,每个物品有一个体积v[i]和重量g[i],选择其中总体积恰好为V的若干个物品,想使这若干个物品的总重量最大,求最大总重量为多少。(如果不存在合法方案,返回-1)

示例1

输入

[1,2,3],[2,3,4],3

输出

5

说明

可以选择前两个物品,总体积为1+2=3恰好等于V,总重量为2+3=5,为符合题意选法中的最大重量 
示例2

输入

[1,3],[100,300],2

输出

-1

说明

只有一个体积为1的和一个体积为3的物品,无法选出总体积为2的若干物品,所以返回-1 

备注:
给定三个参数,第一个参数为数组v,第二个参数为数组g,第三个参数为体积V,求最大总重量为多少。
(所给字符串与返回字符串都不带引号)
方法1:视为特殊的背包问题,采用动态规划进行求解:
class Solution:
    def Maximumweight(self , v , g , V ):
        # write code here
        nums = len(v)
        Matrix = [[0 for j in range(V+1)] for i in range(nums+1)]
        for i in range(1,nums+1):
            Matrix[i] = Matrix[i-1].copy()
            for j in range(1,V+1):
                volume = v[i-1]   
                weight = g[i-1]
                 
                if volume<=j:
                    if Matrix[i-1][j-volume]!=0&nbs***bsp;j-volume==0:
                        Matrix[i][j] = max(Matrix[i-1][j-volume]+weight,Matrix[i-1][j])
 
         return Matrix[-1][-1] if Matrix[-1][-1]!=0 else -1
超内存,只能使用遍历了。

方法二:遍历
class Solution:
    def Maximumweight(self , v , g , V ):
        n = len(v)
        gmax = -1
        for i in range(1,1<<n):
            p, j, vsum, gsum = i, 0, 0, 0
            while p:
                vsum += p%2 * v[j]
                gsum += p%2 * g[j]
                j += 1
                p >>= 1
            if vsum==V:
                gmax = max(gmax,gsum)
        return gmax 
通过


发表于 2021-03-10 21:33:49 回复(0)

问题信息

难度:
1条回答 1201浏览

热门推荐

通过挑战的用户

查看代码