首页 > 【模板】完全背包
头像 程序猿大队长
发表于 2021-11-30 14:33:36
一、0-1背包 第一类问题:最大价值 确定状态 容量+剩余物品数量 确定选择 针对一个物品放入背包或者不放入背包两种选择 确定dp含义 dp[i][j]表示针对前i个物品,在容量为j的限制下,所能存放的最大价值 确定base case 当物品数量为0或者背包体积为0时,最大价值为0,即dp[0][ 展开全文
头像 其实是牛哥
发表于 2021-10-19 15:44:45
完全背包 难度:3星 设 dp[i][j]dp[i][j]dp[i][j] 为前iii个物品,背包容量为jjj的最大价值。 那么考虑第iii个物品是否放入,有两种情况: 如果不放,那么等同于前i−1i-1i−1个物品,容量为jjj的背包的最优方案。 如果放,又可以分为放1个,2个....k个,同0 展开全文
头像 KEY.L
发表于 2022-07-06 21:56:43
先上代码,和01背包问题的解法有略微的改动,区别在于遍历体积 jj 时从逆序改为顺序,在上一题中有我关于01背包问题的理解。 上一篇代码中(01背包中),解释过,逆序是为了保证更新当前状态时,用到的状态是上一轮的状态,保证每个物品只有一次或零次; 在这里,因为每个物品可以取任 展开全文
头像 文和906
发表于 2021-11-01 15:16:40
这道题在弄懂01背包问题后基本没有难度。基本思路与01背包问题相同。唯一不同的是,题目中的物品可以重复加入,而01背包问题中要避免物品重复加入。在01背包问题中,避免重复添加一件物品是通过逆序遍历来实现的,而在本题中要包含重复添加一件物品的情况,只需将逆袭改为正序遍历即可。 附01背包问题题解 #i 展开全文
头像 姐姐的遮阳伞
发表于 2022-03-18 16:12:02
import java.util.Scanner; import java.util.Arrays; public class Main { public static void main(String[] args) { // 以下代码用于获取输入数据 展开全文
头像 xqxls
发表于 2021-10-28 17:21:16
题意整理。 给定一个背包,能容纳体积为V。然后有n种物品,每种物品有一个对应的体积和价值,并且每个物品有无数个。 求这个背包最多能装多大价值的物品。 如果背包恰好装满,最多能装多大价值的物品。 方法一(动态规划) 1.解题思路 第一问: 状态定义:dp1[i]表示不考虑背包是否装满,在容量为i 展开全文
头像 fred-coder
发表于 2021-11-12 14:09:21
同上题类似,由于物品的数量有任意多个,则压缩 dp 后遍历时不采用逆序; 代码如下: n, v = map(int, input().strip().split()) dp_1 = [0 for _ in range(v + 1)] dp_2 = [float('-inf') for _ in ra 展开全文
头像 不会Cplus
发表于 2025-05-09 17:25:25
#include <bits/stdc++.h> using namespace std; #define N (int)(1e3+5) int dp[N]; int dp2[N]; int value[N],volume[N]; int my_max(int a,int b){ 展开全文
头像 Gnomeshgh112
发表于 2025-04-11 16:49:33
问题1:dp[i]表示背包最大容量为i的情况下,能装下的最多价值。由于完全背包中,每个物品可以选择无数次。一种比较简单的思路是,每一个物品都copy足够多次,多到单独选择任意一个物品都能够填满整个背包。这样将物品数量增加,将问题转换为0 1背包。但是这种思路会被卡。另外的思路:考虑在0 1背包中,是 展开全文
头像 秋天Code
发表于 2023-08-31 13:21:35
与01 背包不同的是,一个物品可以无限次放入。我们可以在本次物品的基础上继续放入,而不是在前一个物品的基础上放入,因此我们只需要在01背包的代码上稍作修改即可。例题:P1616 疯狂的采药二维数组 for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++) 展开全文