NC145 01背包

描述

已知一个背包最多能容纳体积之和为v的物品

现有 n 个物品,第 i 个物品的体积为 vi , 重量为 wi

求当前背包最多能装多大重量的物品?

数据范围: 1 \le v \le 10001≤v≤1000 , 1 \le n \le 10001≤n≤1000 , 1 \le v_i \le 10001≤vi​≤1000 , 1 \le w_i \le 10001≤wi​≤1000

进阶 :O(n \cdot v)O(n⋅v)

示例1

输入:

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

复制返回值:

4

复制说明:

第一个物品的体积为1,重量为3,第二个物品的体积为10,重量为4。只取第二个物品可以达到最优方案,取物重量为4     

示例2

输入:

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

复制返回值:

11

复制说明:

两个物品体积之和等于背包能装的体积,所以两个物品都取是最优方案  

0-1背包问题入门小结 动态规划(DP)经典题目 POJ324 POJ1276_sj13051180的专栏-CSDN博客最近在做背包问题,今天写点东西总结一下。        背包问题,常见的有三种类型:基本的0-1背包、完全背包和多重背包、二维背包         首先是基本的0-1背包问题。因为这里的物品一般指花瓶、玉器什么的,要么拿、要么不拿,只有0和1两种状态,所以也叫0-1背包。https://blog.csdn.net/sj13051180/article/details/6687674?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-2.pc_relevant_default&utm_relevant_index=5

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算01背包问题的结果
     * @param V int整型 背包的体积
     * @param n int整型 物品的个数
     * @param vw int整型vector> 第一维度为n,第二维度为2的二维数组,vw[i][0],vw[i][1]分别描述i+1个物品的vi,wi
     * @return int整型
     */
    int knapsack(int V, int n, vector >& vw) {
        // write code here
        if (V==0 || n == 0)
            return 0;
        vector dp(V+1, 0);
        for (int i=0;i=0;j-- ){
                if(vw[i][0] <= j){
                    dp[j] = max(dp[j], dp[j-vw[i][0]]+vw[i][1]);//放第i个物品,价值比较,与不放的情况对比。倒序是怕一维数组把结果覆盖了,导致错误,保证dp[j-vw[i][0]]的价值是不包含第i个物品的
                }
            }
        }
        return dp[V];
    }
};

你可能感兴趣的:(nowcoder,动态规划,算法)