列表

详情


NC309. 完全背包

描述

你有一个背包,最多能容纳的体积是V。

现在有n种物品,每种物品有任意多个,第i种物品的体积为v_i ,价值为w_i

(1)求这个背包至多能装多大价值的物品?
(2)若背包恰好装满,求至多能装多大价值的物品?

数据范围:

示例1

输入:

6,2,[[5,10],[3,1]]

输出:

[10,2]

示例2

输入:

8,3,[[3,10],[9,1],[10,1]]

输出:

[20,0]

说明:

无法恰好装满背包。

示例3

输入:

13,6,[[13,189],[17,360],[19,870],[14,184],[6,298],[16,242]]

输出:

[596,189]

说明:

可以装5号物品2个,达到最大价值298*2=596,若要求恰好装满,只能装1个1号物品,价值为189.

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 4ms, 内存消耗: 512KB, 提交时间: 2022-06-18

class Solution {
  public:
    vector<int> knapsack(int v, int n, vector<vector<int> >& nums) {
        vector<int> a(v + 1, 0);
        vector<int> b(v + 1, INT_MIN);
        b[0] = 0;
        for (int i = 1; i <= n; i++) {
            int x = nums[i - 1][0];//最大容量
            int y = nums[i - 1][1];//最大价值
            for (int j = x; j <= v; j++) {
                a[j] = max(a[j], a[j - x] + y);
                b[j] = max(b[j], b[j - x] + y);
            }
        }
        vector<int> c(2);
        c[0] = a[v];
        c[1] = b[v] > 0 ? b[v] : 0;
        return c;
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 512KB, 提交时间: 2022-05-04

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param v int整型 
     * @param n int整型 
     * @param nums int整型vector<vector<>> 
     * @return int整型vector
     */
    vector<int> knapsack(int v, int n, vector<vector<int> >& nums) {
        // write code here
        vector<int> dp_1(v + 1, 0);
        vector<int> dp_2(v + 1, INT_MIN);
        dp_2[0] = 0;
        for (int i = 1; i <= n; i++) {
            int weight = nums[i - 1][0];
            int value = nums[i - 1][1];
            for (int j = weight; j <= v; j++) {
                dp_1[j] = max(dp_1[j], dp_1[j - weight] + value);
                dp_2[j] = max(dp_2[j], dp_2[j - weight] + value);
            }
        }
        vector<int> dp(2);
        dp[0] = dp_1[v];
        dp[1] = dp_2[v] > 0 ? dp_2[v] : 0;
        return dp;
    }
};

C++ 解法, 执行用时: 5ms, 内存消耗: 416KB, 提交时间: 2022-06-26

class Solution {
  public:
    vector<int> knapsack(int v, int n, vector<vector<int> >& nums) {
        vector<int> a(v + 1, 0);
        vector<int> b(v + 1, INT_MIN);
        b[0] = 0;
        for (int i = 1; i <= n; i++) {
            int x = nums[i - 1][0];//最大容量
            int y = nums[i - 1][1];//最大价值
            for (int j = x; j <= v; j++) {
                a[j] = max(a[j], a[j - x] + y);
                b[j] = max(b[j], b[j - x] + y);
            }
        }
        return {a[v], b[v] > 0 ? b[v] : 0};
    }
};

C++ 解法, 执行用时: 5ms, 内存消耗: 428KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param v int整型 
     * @param n int整型 
     * @param nums int整型vector<vector<>> 
     * @return int整型vector
     */
    vector<int> knapsack(int v, int n, vector<vector<int> >& nums) {
        // write code here
        vector<int> a(v+1,0);
        vector<int> b(v+1,INT_MIN);
        b[0]=0;
        for(int i=1;i<=n;i++)
        {
            int x=nums[i-1][0];
            int y=nums[i-1][1];
            for(int j=x;j<=v;j++)
            {
                a[j]=max(a[j],a[j-x]+y);
                b[j]=max(b[j],b[j-x]+y);
            }
        }
        vector<int> c(2);
        c[0]=a[v];
        c[1]=b[v]>0?b[v]:0;
        return c;
    }
};

C++ 解法, 执行用时: 5ms, 内存消耗: 428KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param v int整型 
     * @param n int整型 
     * @param nums int整型vector<vector<>> 
     * @return int整型vector
     */
    vector<int> knapsack(int v, int n, vector<vector<int> >& nums) {
        // write code here
//         vector<int> dp(v+1,0);
        vector<int> ans(2,0);
        vector<int> ws(v+1,0);
        vector<int> vs(v+1,0);               
        
        for(int i = 0;i<n;++i){
            int s = nums[i][0];//sz
            int w = nums[i][1];//ws
            for(int j = s;j<=v;++j){
                ws[j] = std::max(ws[j],ws[j-s]+w);
                if(vs[j-s]!=0 || j-s == 0)
                vs[j] = std::max(vs[j],vs[j-s]+w);
                
            }
        }
        
        ans[0] = ws[v];
        ans[1] = vs[v];
        return ans;
    }
};

上一题