动态规划(7)-01背包

01背包

https://www.nowcoder.com/practice/2820ea076d144b30806e72de5e5d4bbf?tpId=188&tqId=38312&rp=1&ru=%2Factivity%2Foj&qru=%2Fta%2Fjob-code-high-week%2Fquestion-ranking&tab=answerKey

题目描述

已知一个背包最多能容纳物体的体积为V
现有n个物品第i个物品的体积为v_i,第i个物品的重量为w_iw
求当前背包最多能装多大重量的物品

示例1

输入
10,2,[[1,3],[10,4]]
返回值
4
说明
第一个物品的体积为1,重量为3,第二个物品的体积为10,重量为4。只取第二个物品可以达到最优方案,取物重量为4

思路

  1. 递推如下:
  2. 包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j)
  3. 还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}。

code

import java.util.*;
public class Solution {
    public int knapsack (int V, int n, int[][] vw) {
        int dp[][] = new int[n+1][V+1];
        for(int i=1;i<=n;i++)
            for(int j=1;j<=V;j++){
                int v=vw[i-1][0],w=vw[i-1][1];
                if(j<v)
                    dp[i][j]=dp[i-1][j];
                else
                    dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-v]+w);
            }
        return dp[n][V];
    }
}
全部评论

相关推荐

青春运维少年不会梦到...:实习大王
点赞 评论 收藏
分享
11-17 11:15
门头沟学院 Java
金山办公终于发offer了,但薪资和平台都不如已有的offer打算拒了,A不了薪资,不满意直接拒了,留给需要的人嘿嘿嘿时间线:10.14线下一面&nbsp;,10.23线上二面,下午发测评,11月1日HR面,11月14日电话谈薪,11月17日直接发offer
star__plat...:好兄弟干的好啊,解气。金山第一次笔难度高的离谱,第二次简单的离谱全A了,用人部门筛选中估计最后还是要挂我,就这今早智联招聘还给我发信息让我投
offer帮选
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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