有 NN 件物品和一个容量是 VV 的背包。每件物品只能使用一次。

第 ii 件物品的体积是 vivi,价值是 wiwi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式

第一行两个整数,N,VN,V,用空格隔开,分别表示物品数量和背包容积。

接下来有 NN 行,每行两个整数 vi,wivi,wi,用空格隔开,分别表示第 ii 件物品的体积和价值。

输出格式

输出一个整数,表示最大价值。

数据范围

0<N,V≤10000<N,V≤1000
0<vi,wi≤10000<vi,wi≤1000

输入样例

4 5
1 2
2 4
3 4
4 5

输出样例:

8

思路:


f[i][j]:表示所有选法集合中,只从前i个物品中选,并且总体积比j小的选法的集合,它的值是这个集合中每一个选法的最大值.
状态转移方程
f[i][j] = max(f[i-1][j], f[i-1][j-v[i]]+w[i])
f[i-1][j]:不选第i个物品的集合中的最大值
f[i-1][j-v[i]]+w[i]:选第i个物品的集合,但是直接求不容易求所在集合的属性,先将第i个物品的体积减去,求剩下集合中选法的最大值.
问题,例如选择物品的体积为3,那么他的上一个就得是f[i-1][j-3],加上他之后就是f[i][j]

集合如何划分

一般原则:不重不漏,不重不一定都要满足(一般求个数时要满足)

如何将现有的集合划分为更小的子集,使得所有子集都可以计算出来。

import java.util.Scanner;

public class Solution2 {
public static void main(String[] args)
{
    int m,n;
    Scanner sc = new Scanner(System.in);
    m = sc.nextInt();//物品数量
    n = sc.nextInt();//背包容量
    int i,j;
    int dp[][] = new int[m+1][n+1];
    dp[0][0]=0;
    int weight[] = new int[m+1];
    int value[] = new int[m+1];
    for(i=1;i<=m;i++)
    {
        weight[i] = sc.nextInt();
        value[i] = sc.nextInt();
    }
    for(i=1;i<=m;i++)
    {
        for(j=0;j<=n;j++)
        {
            dp[i][j] = dp[i-1][j];//不选第i个
            if(j>=weight[i])
            {
                dp[i][j]=Math.max(dp[i][j], dp[i-1][j-weight[i]]+value[i]);
            }
        }
    }
    int max = 0;
    for(i=0;i<=n;i++)
    {
        max = Math.max(max, dp[m][i]);
    }
    System.out.println(max);
}
}
优化后的代码:dp只与前面那一行有关,与列无关,所以可以使用一维数组

import java.util.Scanner;

public class Main {
public static void main(String[] args)
{
    int m,n;
    Scanner sc = new Scanner(System.in);
    m = sc.nextInt();//物品数量
    n = sc.nextInt();//背包容量
    int i,j;
    int dp[] = new int[n+1];
    int weight[] = new int[m+1];
    int value[] = new int[m+1];
    for(i=1;i<=m;i++)
    {
        weight[i] = sc.nextInt();
        value[i] = sc.nextInt();
    }
    for(i=1;i<=m;i++)
    {
        for(j=n;j>=weight[i];j--)  //从大到小枚举是因为,如果写成从小到大,那相当于是

//dp[i][j]=Math.max(dp[i][j], dp[i][j-weight[i]]+value[i]),

//例如:第一个物体体积为3,dp[3]=3,dp[6]=6,选取了两次,i=1时,dp[3~n]都应该是3,因为此时物体只有一个
        {

dp[j]=Math.max(dp[j], dp[j-weight[i]]+value[i]);
        }
    }
    int max = 0;
    for(i=0;i<=n;i++)
    {
        max = Math.max(max, dp[i]);
    }
    System.out.println(max);
}
}

AcWing--2.01背包问题相关推荐

  1. 【AcWing】AcWing 2. 01背包问题

    目录 一.题目 1.原题链接 2.题目描述 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 一.题目 1.原题链接 2. 01背包问题 - AcWing题库 2.题目描述 有 N 件物品和一 ...

  2. ACwing 2. 01背包问题(DP)

    文章目录 1. 题目 2. 解题 1. 题目 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积 ...

  3. AcWing 2. 01背包问题(01背包模板)

    题目链接 https://www.acwing.com/problem/content/2/ 思路 对于每一个物品我们能做一个选择,选上它(前提是当前的剩余背包容量够),或者不选,那么我们只需要在这其 ...

  4. acwing 2. 01背包问题

    有 N 件物品和一个容量是 V的背包.每件物品只能使用一次.第 i件物品的体积是 vi,价值是 wi.求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且价值最大.输出最大价值. 输入格式 ...

  5. 九种 0-1 背包问题详解

    目录 动态规划概念 问题1:0-1背包问题 问题2:完全背包问题 问题3:多重背包问题 问题4:混合背包问题 问题5:二维背包问题 问题6:分组背包问题 问题7:有依赖的背包问题 (困难) 问题8:背 ...

  6. ACwing 3. 完全背包问题(DP)

    文章目录 1. 题目 2. 解题 1. 题目 有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用. 第 i 种物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体 ...

  7. 0-1背包问题python实现

    0-1背包问题 ACWings题目链接:https://www.acwing.com/problem/content/2/ 不会的小伙伴可以看一下视频:https://www.bilibili.com ...

  8. 动态规划:01背包问题

    一.什么是01背包问题? 举个例子,你要去一个水果摊拿水果,每种水果都有对应的两种属性:占用的体积V和蕴含的价值W.而你的背包体积为N.老板说:每种水果只能拿一个!因此对于咱们肯定得想一种搭配方式使得 ...

  9. 19185 01背包问题

    19185 01背包问题 题目 题解 一维dp优化代码 题目 Description 一个旅行者有一个最多能装 M公斤的背包,现在有 n件物品,它们的重量分别是W1,W2,-,. 它们的价值分别为C1 ...

  10. 第一章 动态规划 背包问题之01背包问题

    背包问题题谱 1.基础01背包问题 1. 问题描述 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次.第 i 件物品的体积是 vi,价值是 wi.求解将哪些物品装入背包,可使这些物品的总体 ...

最新文章

  1. mysql int char连接_MySQL中int、char以及varchar的性能比较
  2. 最初的梦想,将来的你一定会感谢现在努力的自己
  3. UVA10382喷水装置
  4. Git远程推送和抓取分支
  5. Android--intent详解
  6. 7种进阶方法让你快速测试端口连通性
  7. 数据级并行--计算机体系结构
  8. getLong java_java.lang.Long.getLong()方法实例
  9. 服务器 mysql iis 内存_windows服务器iis配置php和mysql环境图文教程
  10. 十五的学习日记20160926-你不知道的JS笔记/
  11. matlab计算均值和方差
  12. Android车牌识别sdk开发包,基于Android和iOS平台的车牌识别SDK开发包
  13. openpyxl给excel设置条件格式
  14. PHP+MySQL实现留言板功能(一)
  15. LNOI2022 退役记
  16. Verilog中寄存器和储存器的建模
  17. [创业之路-45] :复盘与自省 - 创业公司如何设定股权退出机制?
  18. queue.queue是什么
  19. 7-18 二分法求多项式单根
  20. 我的世界mod开发(5)做一把无敌的剑

热门文章

  1. LeetCode 6. Z 字形变换(找规律)
  2. LeetCode 第 21 场双周赛(779/1913,前40.7%)
  3. LeetCode 816. 模糊坐标
  4. java jdbc操作类_Java-编写一个jdbc操作类
  5. 传智播客java测试题_传智播客Java基础综合测试题
  6. Codeforces Round #702 (Div. 3)解题报告
  7. java流的传递方式是_java中数据的传递方式到底是怎样的!
  8. matlab记录路径,matlab对文件目录路径的操作
  9. python3.6是用来干嘛的_学 Python 都用来干嘛的?
  10. Spring Boot中使用Spring Security进行安全控制