首页 > 编程语言 >算法-动态规划-完全背包

算法-动态规划-完全背包

时间:2024-08-29 11:52:55浏览次数:6  
标签:背包 scanner int 算法 数组 new 动态 dp Scanner

0. 动态规划五部曲:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

img

1. 完全背包问题

完全背包问题中,每个物品都有无数个可以重复选择

  • 二维dp数组
    int[][] dp = new int[n][totalWeight+1];
    for(int i = 0; i<n; ++i) {
        for(int j = 0; j<= totalWeight; ++j) {
            if(j < weight[i])
                dp[i][j] = dp[i-1][j];
            else 
                // 01背包是dp[i-1][j-weight[i]]+value[i],一个物品不能重复选
                dp[i][j] = Math.max(dp[i-1][j], dp[i][j-weight[i]]+value[i]);
        }
    }
    
  • 一维dp数组:顺序遍历,允许同种物品被重复选择。
        int[] dp = new int[totalWeight+1];
        for(int i = 0; i<n; ++i) {
            for(int j = weight[i]; j<=totalWeight; ++j) {
                dp[j] = Math.max(dp[j], dp[j-weight[i]] + value[i]);
            }
        }
    
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int totalWeight = scanner.nextInt();
        int[] weight = new int[n];
        int[] value = new int[n];
        
        for(int i = 0; i<n; ++i) {
            weight[i] = scanner.nextInt();
            value[i] = scanner.nextInt();
        }
        
        int[] dp = new int[totalWeight+1];
        for(int i = 0; i<n; ++i) {
            // 顺序遍历,同一个物品可以重复选
            for(int j = weight[i]; j<=totalWeight; ++j) {
                dp[j] = Math.max(dp[j], dp[j-weight[i]]+value[i]);
            }
        }
        
        System.out.println(dp[totalWeight]);
    }
}

标签:背包,scanner,int,算法,数组,new,动态,dp,Scanner
From: https://www.cnblogs.com/hifrank/p/18386390

相关文章

  • TimeWheel算法介绍及在应用上的探索
    作者:来自vivo互联网服务器团队-LiFan本文从追溯时间轮算法的出现,介绍了时间轮算法未出现前,基于队列的定时任务实现,以及基于队列的定时任务实现所存在的缺陷。接着我们介绍了时间轮算法的算法思想及其数据结构,详细阐述了三种时间轮模型的数据结构和优劣性。再次,我们介绍时......
  • EAS之WALT算法介绍
    EAS调度器缘起Linux内核的一直都使用完全公平调度器CFS(CompletelyFairScheduler)作为默认调度器,但是在使用中发现CFS如下几个问题。CFS主要是为了服务器性能优先场景而设计的,主要目标是最大限度地提高系统的吞吐量,CFS调度的目标是所有任务都平均分配到系统所有可用的CPU上......
  • 数据结构与算法(循环链表,双向链表)
    循环链表最后一个元素指向首元素带尾指针的循环链表合并双向链表双向链表:在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表双向链表插入操作思路代码删除操作思路代码三种链表比较顺序表......
  • 用python写一个生产管理算法
    在生产管理中,算法可以帮助优化生产流程、提高效率和降低成本。一个简单的生产管理算法可能包括任务分配、资源调度、生产线平衡等方面。下面我将提供一个基本的任务分配算法的示例,这个算法将基于工人的技能和可用性来分配任务。```pythonclassWorker:def__init__(self,id......
  • Cesium展示——图标 billboard 动态变化
    文章目录需求分析1.导入2.加载billboard3.点击图标展示对应name属性4.实现动态变化4.上代码需求Cesium展示——图标动态变化分析1.导入importspjkfrom'./assets/spjk.png';2.加载billboardfunctionaddBillboard(lon......
  • Cesium 展示——动态洪水淹没效果
    文章目录需求分析1.引入插件2.定义变量3.开始绘制3.1绘制点3.2绘制线3.3绘制面3.4开始分析(第一种)3.5开始分析(第二种)3.6方法调用4.整体代码其他需求从低处到高处实现洪水淹没效果分析本篇文章对方法进行单独抽离,因此支持......
  • 代码随想录算法训练营第四十三天 | 300.最长递增子序列 , 674. 最长连续递增序列 , 718.
    目录300.最长递增子序列 思路1.dp[i]的定义2.状态转移方程3.dp[i]的初始化4.确定遍历顺序 5.举例推导dp数组方法一:动态规划方法二:贪心心得收获 674.最长连续递增序列思路动态规划1.确定dp数组(dptable)以及下标的含义2.确定递推公式3.dp数组如何初始化4.......
  • 【408DS算法题】028基础-查找二叉树的最大值结点
    Index题目分析实现总结题目给定二叉树的根节点,找到二叉树中结点值最大的结点。分析实现对于查找二叉树中的最大值结点,在二叉树的遍历(DFS、层次遍历)的基础上进行修改可以轻松地达成这一目的。本文中选用的是相对直观的后序遍历,具体实现如下:BTNode*findMax(BTN......
  • 算法练习题03:分解质因数
    【问题描述】求出区间[a,b]中所有整数的质因数分解,统计一共有多少种不同的分法【输入格式】输人两个整数a和b。【输出格式】输出一行,一个整数,代表区间内质因数分解方法之和。【输入样例】610【输出样例】10【样例说明】6的质因数为2和3,一共有两个。7的质因数有......
  • 代码随想录算法训练营第二十九天(贪心 三)
    力扣题部分:134.加油站题目链接:.-力扣(LeetCode)题面:在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为......