首页 > 其他分享 >背包DP

背包DP

时间:2023-10-06 19:35:12浏览次数:39  
标签:cnt 背包 int max cin 枚举 DP

题目背景:你有一个容量为 M的背包,有N个物品,每个物品的重量和价值分别为w[i]和c[i],现在选一些物品放入这个背包使装入的价值最大

1. 01背包(每件物品只有1件):倒序枚举重量,O(N^2)

	E(i,n){
		cin>>w>>c;
		for(int j=m;j>=w;--j) f[j]=max(f[j],f[j-w]+c);
	}

2.完全背包(每件物品无数件):正序枚举,O(N^2)

		for(int j=w;j<=m;++j) f[j]=max(f[j],f[j-w]+c);

3.多重背包(第i件物品有x[i]件)

(1)当成x[i]次01背包处理,O(NMX)

#define F(i,l,r) for(int i=l;i<=r;++i)
#define G(i,r,l) for(int i=r;i>=l;--i) 
	F(i,1,n){
		cin>>w>>c>>x;
		F(k,1,x) G(j,m,w) f[j]=max(f[j],f[j-w]+c);	
	}

(2)二进制优化:x[i]=1+2+4+...2^k+tmp,tmp是剩下的一个碎块,O(NMlogX)

	F(i,1,n){
		cin>>w[i]>>c[i]>>x;
		for(int j=1;x-j>=0;j*=2) w[++cnt]=w[i]*j,c[cnt]=c[i]*j,x-=j;
		w[i]*=x; c[i]*=x;
	}//转化过程
//	F(i,1,cnt) printf("%d %d\n",w[i],c[i]);
	F(i,1,cnt) {
//		if(!w[i]) continue;
		G(j,m,w[i]) f[j]=max(f[j],f[j-w[i]]+c[i]);	
	}//dp过程

4.分组背包:每组只能选一个,只要想明白如何满足这个限制即可

	F(i,1,n){
		cin>>x[i];
		F(k,1,x[i]) cin>>w[i][k]>>c[i][k];
	}
	F(i,1,n) G(j,m,0) F(k,1,x[i]) if(j>=w[i][k]) f[j]=max(f[j],f[j-w[i][k]]+c[i][k]);	
	//先倒序枚举容量,再枚举物品,这样能保证f[j]每组只会新放一个物品进去(要么就不放)! 
	cout<<f[m];

标签:cnt,背包,int,max,cin,枚举,DP
From: https://www.cnblogs.com/superl61/p/17744869.html

相关文章

  • P9140 [THUPC 2023 初赛] 背包
    prologue这很难评(调了我1h,我都想紫砂了。还是典型得不重构就看不见系列。analysis如果我们还是一个正常人,那么我们大体上是能看到题目的加粗字,这个格式很明显符合我们的同余最短路的格式。(如若不知,请先出门直走)然后我们就要考虑这个同余最短路的实现。这个题目不同于往常......
  • Python使用socket的UDP协议实现FTP文件服务
    简介本示例主要是用Python的socket,使用UDP协议实现一个FTP服务端、FTP客户端,用来实现文件的传输。在公司内网下,可以不适用U盘的情况下,纯粹使用网络,来实现文件服务器的搭建,进而实现文件的网络传输。同时用来理解Python的socket使用。服务端运行起来后,会把服务器上面的指......
  • 算法之动态规划(DP)求解完全背包问题(状态转移式方程推导)
    完全背包是01背包的进阶版。在这里补充一下代码随想录的完全背包状态转移式的推导。有兴趣的可以先看一看原版。状态转移方程状态:dp[i][j]选择前i个物品,容量为j的背包时所选物品价值总和最大。状态转移:dp[i][j]=max(dp[i-1][j-k*v[i]]+k*w[i])(k=0,1,2,3...)(j-k*v......
  • 10.5 认识XEDParse汇编引擎
    XEDParse是一款开源的x86指令编码库,该库用于将MASM语法的汇编指令级转换为对等的机器码,并以XED格式输出,目前该库支持x86、x64平台下的汇编编码,XEDParse的特点是高效、准确、易于使用,它可以良好地处理各种类型的指令,从而更容易地确定一段程序的指令集。XEDParse库可以集成到许多不......
  • DP提高专项3
    本场比赛难度吧不大,建议开题顺序为\(T2-T1-T3\)。\(T2\)题目描述有\(n\)个高楼排成一行,每个楼有一个高度\(h_i\)。称可以从楼\(i\)跳到楼\(j\),当\(i\),\(j\)(\(i<j\))满足以下三个条件之一:\(i+1=j\)\(\max(h_{i+1},h_{i+2},\cdots,h_{j-1})<\min(h_i,h_j......
  • 【DP】ABC273F Hammer 2 题解
    ABC273F一道比较板的区间\(\text{dp}\)。先对坐标离散化,令离散化数组为\(v\)。令\(f_{i,j}\)表示能走到区间\([v_i,v_j]\)的最短路程,显然\(f\)数组初始为\(inf\)。但发现这样无法转移,可以再增加一维\(k\in\{0,1\}\),表示此时在\([v_i,v_j]\)的\(v_i/v_j\)处。......
  • 【思维】【DP】ABC298Ex Sum of Min of Length 题解
    ABC298Ex简单题。因为有\(\min\)不好做,容易想到讨论\(d(i,L)\)和\(d(i,R)\)的大小。令\(p=\text{LCA}(L,R)\),\(dep_L>dep_R,dist=dep_L+dep_R-2\timesdep_p\),\(now\)满足\(dep_L-dep_{now}=\lfloor\dfrac{dist}{2}\rfloor\)则\(L\)一定在......
  • 动态规划--DP
    动态规划动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。背包01背包每个物体只有两种可能的状态(取与不取),对应二进制中的\(0\)和\(1\),这类问题便被称为「0-1背包问题」。状态转移方程:\[f_{i,j}=\max(f_{i-1,j},f_{i-1,j-w_{i}}+v_{i})\]这......
  • 【竞赛图】【DP】ARC163D Sum of SCC 题解
    ARC163D发现这个竞赛图一定能被分为两个集合\(A\),\(B\)。满足\(\forallu\inA,v\inB\),均有\(u\tov\inE\)。答案就是划分这两个集合的方案数。证明:首先,竞赛图缩完点后一定是一条链,对强连通分量进行标号,满足编号小的强连通分量指向编号大的强连通分量。不妨令竞赛图\(G\)......
  • 【整除分块】【DP】ABC239Ex Dice Product 2 题解
    ABC239H简单题。令\(f_i\)表示乘到\(\gei\)的期望。容易得到\(f_i=\dfrac{\sum\limits_{j=1}^{n}f_{\lceil\frac{i}{j}\rceil}}{n}\)。将\(f_i\)移到同一边,去掉系数,有\(f_i=\dfrac{n\sum\limits_{j=2}^{n}f_{\lceil\frac{i}{j}\rceil}}{n-1}\)。提出\(\frac{n-1}{n......