首页 > 其他分享 >AcWing 3. 完全背包问题

AcWing 3. 完全背包问题

时间:2023-12-04 11:01:13浏览次数:34  
标签:背包 int Vi Wi 完全 max 物品 AcWing

题面:
有 \(N\) 种物品和一个容量是 \(V\) 的背包,每种物品都有无限件可用。
第 \(i\) 种物品的体积是 \(v_i\) ,价值是 \(w_i\) 。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

原题链接:3. 完全背包问题 - AcWing

根据01背包的思路扩展到完全背包

  1. 01背包:建立集合,对于第 \(i\) 种物品来说,有 /不选 两种选择;
  2. 完全背包:建立集合,对于第 \(i\) 种物品来说,有 选0件(不选)/选1件/选2件/……/选k件/……
    共 \(v/v[i]+1\) 种选择。
  • 完全背包-状态转移方程:\(F(i,j)=max(F(i-1,j),F(i,j-v)+w);\)
  • 推导过程
    • 01背包-状态转移方程:\(F(i, j) = max(F(i-1, j), F(i-1, j-Vi) + Wi)\) \(j≥Vi\);
    • 完全背包-朴素方程:\(F(i, j) = max(F(i-1, j), F(i-1, j-Vi) + Wi, F(i-1, j-2×Vi) + 2×Wi...)\) \(j≥Vi\);
    • 等价变形:\(F(i, j-v_i) = max(F(i-1, j-v_i), F(i-1, 2×j-Vi) + Wi, F(i-1, j-3×Vi) + 2×Wi...)+w\) \(j≥Vi\);
#include <bits/stdc++.h>
using namespace std;

const int N = 1010;
int v[N], w[N];
int f[N][N];

int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> v[i] >> w[i];
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			f[i][j] = f[i - 1][j];
			if (j >= v[i])
				f[i][j] = max(f[i][j], f[i][j - v[i]] + w[i]);
		}
	}
	cout << f[n][m];
}

二次优化降维

  1. 01背包优化:从大到小枚举体积;
    ①确保在计算 \(f[j]\) 时,\(f[j-v[i]]\) 已经被更新过:
    ②保证每个物品仅被添加一次。
  2. 完全背包优化:从小到大枚举体积;
    因为当背包容积较小时,右侧集合不一定存在。
#include <bits/stdc++.h>
using namespace std;

const int N = 1010;
int v[N], w[N], f[N];

int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> v[i] >> w[i];
	for (int i = 1; i <= n; i++)
	    for (int j = v[i]; j <= m; j++)
			f[j] = max(f[j], f[j - v[i]] + w[i]);
	cout << f[m];
}

标签:背包,int,Vi,Wi,完全,max,物品,AcWing
From: https://www.cnblogs.com/haruhomu/p/17874430.html

相关文章

  • AcWing 2. 01背包问题
    题面:有 \(N\) 件物品和一个容量是 \(V\) 的背包。每件物品只能使用一次。第 \(i\) 件物品的体积是 \(v_i\),价值是 \(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原链接:2.01背包问题-AcWing有限集的最优问......
  • Acwing第132场周赛
    AcWing5366.大小写转换#include<bits/stdc++.h>#definelsp<<1#definersp<<1|1#definePIIpair<int,int>#definelllonglong#definedbdouble#defineullunsignedlonglong#defineendl'\n'#defineioios::sync_with_......
  • 前缀和/差分——acwing算法基础课笔记
    个人笔记,欢迎补充,指正。一维前缀和对于数组:a[1],a[2],a[3]...a[n];其前缀和数组为s[i]=a[1]+a[2]+...+a[i];下标必须从1开始求前缀和1for(inti=1;i<n;++i)2s[i]=s[i-1]+a[i];s[0]需要定义为0作用求原数组里一段数(l,r)的和......
  • 背包问题
    先聊聊区分贪心和01背包背包问题:有多个物品,重量不同、价值不同,以及一个容量有限的背包,选择一些物品装到背包中,问怎么裝才能使装进背包的物品总价值最大。根据不同的限定条件,可以把背包问题分为很多种,常见的有下面两种:(1)如果每个物体可以切分。称为一般背包问题,用贪心法求......
  • Acwing.第132场周赛
    Acwing.第132场周赛比赛地址A.大小写转换题目思路:简单的模拟,可以使用c++大小写转换库函数,但是由于我早上比赛时候没用好就不敢用了就用了ASCII码转换代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ strings; cin>>s; for(inti=0;i<s.size();i++)......
  • 【AcWing-Linux】03. Shell
    Shell一、Shell简介shell是我们通过命令行与操作系统沟通的语言。shell是一种脚本语言,通过对应的脚本解释器解释执行,一般作为内置于操作系统的应用程序向用户提供访问操作系统内核的服务。shell脚本(shellscript)可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复......
  • Gradio-Lite: 完全在浏览器里运行的无服务器 Gradio
    Gradio是一个经常用于创建交互式机器学习应用的Python库。在以前按照传统方法,如果想对外分享Gradio应用,就需要依赖服务器设备和相关资源,而这对于自己部署的开发人员来说并不友好。欢迎Gradio-lite(@gradio/lite):一个通过Pyodide在浏览器中直接运行Gradio的库。在......
  • 代码随性训练营第四十六天(Python)| 139.单词拆分 、多重背包
    139.单词拆分classSolution:defwordBreak(self,s:str,wordDict:List[str])->bool:dp=[False]*(len(s)+1)dp[0]=True#求排列先遍历背包再遍历物品foriinrange(len(s)+1):forjinrange(i):......
  • 代码随想训练营第四十五天(Python)| 70. 爬楼梯 (进阶)、322. 零钱兑换 、 279.完全平方数
    70.爬楼梯(进阶)1、使用01背包解法classSolution:defclimbStairs(self,n:int)->int:#dp数组代表爬上第i阶有dp[j]种方法dp=[0]*(n+1)dp[0]=1m=2#排列先背包后物品foriinrange(n+1):......
  • 代码随想训练营第四十四天(Python)| 完全背包、518. 零钱兑换 II 、377. 组合总和 Ⅳ
    [完全背包]有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。1、先遍历物品再遍历背包defall_bag(weight,value,bag_weight):dp=[0]*......