背包DP模板

[特殊字符] 完全背包问题|二维 DP 经典解法(C++ 模板 + 图文解析) 本文详细解析了完全背包问题的二维动态规划解法,通过定义dp[i][j]表示前i种物品在容量j时的最大价值。核心在于状态转移方程:当容量足够时,可以重复选取当前物品(dp[i][j-c[i]]+w[i])或不选(dp[i-1][j])。提供了可直接刷题的C++模板代码,并对比了与01背包的区别(完全背包可无限选取物品)。文章还包含易错点提醒、空间优化思路和题目变种讨论,适合算法初学者系统学习动态规划中的经典背包问题。 阅读详情

01背包模板

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
const int N=1000;
int v[N+50],w[N+50];
int f[N+50];
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	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=m;j>=v[i];j--)
		{
			f[j]=max(f[j],f[j-v[i]]+w[i]);
		}
	}
	cout<<f[m];
	return 0;
}

完全背包模板

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
const int N=1000;
int v[N+50],w[N+50];
int f[N+50];
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	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];
	return 0;
}

多重背包模板 I

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
const int N=1000;
int v[N+50],w[N+50],s[N+50];
int f[N+50];
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>v[i]>>w[i]>>s[i];
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=m;j>=v[i];j--)
		{
			for(int k=0;k<=s[i]&&k*v[i]<=j;k++)
			{
				f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);
			}
		}
	}
	cout<<f[m];
	return 0;
}

多重背包模板 II

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
const int N=100000;
int vv[N+50],ww[N+50];
int f[N+50];
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin>>n>>m;
	int num=1;
	for(int i=1;i<=n;i++)
	{
		int v,w,s;
		cin>>v>>w>>s;
		for(int j=1;j<=s;j<<=1)
		{
			vv[num]=j*v;
			ww[num]=j*w;
			num++;
			s-=j;
		}
		if(s)
		{
			vv[num]=s*v;
			ww[num]=s*w;
			num++;
		}
	}
	for(int i=1;i<num;i++)
	{
		for(int j=m;j>=vv[i];j--)
		{
			f[j]=max(f[j],f[j-vv[i]]+ww[i]);
		} 
	}
	cout<<f[m];
	return 0;
}

多重背包模板 III

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
const int N=20000;
int f[N+50],g[N+50],q[N+50];
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin>>n>>m;
	int num=1;
	for(int i=1;i<=n;i++)
	{
		memcpy(g,f,sizeof(f));
		int v,w,s;
		cin>>v>>w>>s;
		for(int j=0;j<v;j++)
		{
			int h=0,t=-1;
			for(int k=j;k<=m;k+=v)
			{
				if(h<=t&&q[h]<k-s*v)
				{
					h++;
				}
				if(h<=t)
				{
					f[k]=max(g[k],g[q[h]]+(k-q[h])/v*w);
				}
				while(h<=t&&g[k]>=g[q[t]]+(k-q[t])/v*w)
				{
					t--;
				}
				q[++t]=k;
			}
		}
	}
	cout<<f[m];
	return 0;
}

混合背包模板

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
const int N=1000;
int f[N+50],g[N+50],q[N+50];
int n,m;
void ZeroOnePack(int v,int w)
{
	for(int j=m;j>=v;j--)
	{
		f[j]=max(f[j],f[j-v]+w);
	}
}
void CompletePack(int v,int w)
{
	for(int j=v;j<=m;j++)
	{
		f[j]=max(f[j],f[j-v]+w);
	}
}
void MultiplePack(int v,int w,int s)
{
	memcpy(g,f,sizeof(f));      
  	for(int j=0;j<v;j++)
	{
    	int h=0,t=-1;
    	for(int k=j;k<=m;k+=v)
		{
      		if(h<=t&&q[h]<k-s*v)
			{
			 	h++;
			}
      		if(h<=t)
	  		{
	  			f[k]=max(g[k],g[q[h]]+(k-q[h])/v*w);
	  		}
      		while(h<=t&&g[k]>=g[q[t]]+(k-q[t])/v*w)
			{
			  	t--;
			}
      		q[++t]=k;
      	}
    }
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		int v,w,s;
		cin>>v>>w>>s;
		if(s==-1)
		{
			ZeroOnePack(v,w);
		}
		else if(s==0)
		{
			CompletePack(v,w);
		}
		else
		{
			MultiplePack(v,w,s);
		}
	}
	cout<<f[m];
	return 0;
}

二维费用的背包模板

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
const int N=1000;
int f[N+50][N+50];
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,V,M;
	cin>>n>>V>>M;
	for(int i=1;i<=n;i++)
	{
		int v,m,w;
		cin>>v>>m>>w;
		for(int j=V;j>=v;j--)
		{
			for(int k=M;k>=m;k--)
			{
				f[j][k]=max(f[j][k],f[j-v][k-m]+w);
			}
		}
	}
	cout<<f[V][M];
	return 0;
}

分组背包模板

#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
const int N=100;
int v[N+50],w[N+50];
int f[N+50];
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,V;
	cin>>n>>V;
	for(int i=1;i<=n;i++)
	{
		int s;
		cin>>s;
		for(int j=1;j<=s;j++)
		{
			cin>>v[j]>>w[j];
		}
		for(int j=V;j>=1;j--)
		{
			for(int k=0;k<=s;k++)
			{
				if(j>=v[k])
				{
					f[j]=max(f[j],f[j-v[k]]+w[k]);
				}
			}
		}
	}
	cout<<f[V];
	return 0;
}

有依赖的背包模板

#include<iostream>
#include<cstring>
using namespace std;

const int N=110;
int n,V,p,root;
int v[N],w[N]; 
int h[N],to[N],ne[N],tot; //邻接表
int f[N][N];

void add(int a,int b){
  to[++tot]=b;ne[tot]=h[a];h[a]=tot;
}
void dfs(int u){
  for(int i=v[u];i<=V;i++) f[u][i]=w[u];
  for(int i=h[u]; i; i=ne[i]){  //子节点 
    int s=to[i];
    dfs(s);
    for(int j=V;j>=v[u];j--)    //体积
      for(int k=0;k<=j-v[u];k++)//决策
        f[u][j]=max(f[u][j],f[u][j-k]+f[s][k]);
  }
}
int main(){
  cin>>n>>V;              //物品个数,背包容量
  for(int i=1;i<=n;i++){
    cin>>v[i]>>w[i]>>p;   //体积,价值,依赖的物品编号
    if(p==-1) root=i;
    else add(p,i);
  }
  dfs(root);
  cout<<f[root][V];
}

背包问题求方案数模板

// 不超背包容量的方案数
#include<iostream>
#include<cstring>
using namespace std;

const int N=1010, mod=1e9+7;
int f[N],c[N];
// f[i]表示背包容量为i时最优选法的总价值
// c[i]表示背包容量为i时最优选法的方案数

int main(){
  int n, m, v, w;   
  scanf("%d%d", &n, &m);    
  for(int i=0;i<=m;i++) c[i]=1;    
  
  for(int i=1; i<=n; i++){    //枚举物品
    scanf("%d%d",&v,&w);
    for(int j=m; j>=v; j--){  //枚举体积
      if(f[j-v]+w>f[j]){      //装新物品总价值更大
        f[j]=f[j-v]+w;
        c[j]=c[j-v];
      }
      else if(f[j-v]+w==f[j]) //装新物品总价值相等
        c[j]=(c[j]+c[j-v])%mod;     
    }
  }
  printf("%d\n",c[m]);
}

背包问题求具体方案模板

#include<iostream>
#include<cstring>
using namespace std;

const int N = 1010;
int v[N],w[N];
int f[N][N],p[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=n; i>=1; i--)   //逆序取物 
  for(int j=0; j<=m; j++){  //枚举体积
    f[i][j]=f[i+1][j];
    p[i][j]=j;              //记录路径列 
    if(j>=v[i])
      f[i][j]=max(f[i][j],f[i+1][j-v[i]]+w[i]);
    if(j>=v[i] && f[i][j]==f[i+1][j-v[i]]+w[i])
      p[i][j]=j-v[i];
  }
  
  int j=m;
  for(int i=1; i<=n; i++)
    if(p[i][j]<j){
      printf("%d ",i);
      j=p[i][j];
    }
}

DP背包问题模板:01背包 与 完全背包 01背包问题: 有n件物品,每件物品的重量为w[i],价值为c[i]。现有一个容量为V的背包,问如何选取物品放入背包,使得背包内物品的总价值最大。其中每种物品只有1件。 dp[i][j]:前 i 件物品装入容量为 j 的背包中得到的最大价值 对第 i 件物品,有2种前状态: a. 选择第 i 件物品,则 dp[i][j] = dp[i-1][ j-w[i] ] + c[i] b. 不选择第 ... 阅读详情

相关推荐

第一DP:简单的背包模板

第一DP:简单的背包模板

m0_62021646的博客 935

背包dp模板总结

那么最大价值依赖哪些位置呢,首先肯定依赖i-1,j的位置,因为不选这个位置所以对容量没有任何影响,其次要注意的是我们的要求是不超过j的最大价值,所以要对于所有满足条件的容量j都需要更新,那么代码的递推思路自然就是,首先当前位置等于i-1,j位置的值,就是如果不选的位置,对于i这一层j从零开始到最末尾,只要大于当前物品体积的j位置都要更新为i-1,j,以及(i-1,j-v[i])+w[i],的最大值,因为这些位置选了当前位置的值的时候,从w[i]到v其实都没有超标(假设只考虑这个位置),具体看代码。

icebeeeeeef的博客 815

告别测序污染:手把手教你用Decontam+SCRUB+FEAST完成微生物组数据清洗全流程

本文详细解析了使用Decontam、SCRUB和FEAST三大工具完成微生物组数据清洗的全流程。从环境准备、数据导入到污染物识别、样本间污染校正及溯源分析,提供了一套可复用的污染校正工作流,帮助研究者提升数据质量,确保后续分析的可靠性。

weixin_33462927的博客 316

dp背包模板(01、完全、多重)

背包模板 01背包 dp[j]记录当容量为j时的可行取法的最大价值 状态转移方程dp[j]=max(dp[j],dp[j-w[i]]+v[i]) 注意内层循环为逆序 #include<stdio.h> int dp[1005]; int main() { int T,n,i,j,s,v[1005],w[1005]; scanf("%d", &T);//循环次数 whi...

weixin_45461859的博客 290

Maxwell个人初学经验及资料分享

前段时间学习了课题组基于Maxwell所建立的模型,因为以前从来没有使用过,只是按照一步一步记忆了操作,但总觉得不熟悉,我想是缺乏对这个软件整体的了解,真正想上手只会这一个模型也没有办法扩展。但是我感觉这些有限元分析软件学习起来应该有一些共性,基于以前对COMSOL学习的一点经验,我就在官网和其他网站找了一些学习资源构成一条基础入门之路,也可能有更好的资源,仅代表个人观点做一下分享。以上就是本人对该软件初步学习的一点理解,跟着这样的操作不到一个星期就能初步的掌握。...

怎么又是萝卜的博客 5631

EMC辐射发射测试:垂直与水平极化测试原理与实战指南

电磁兼容(EMC)测试是确保电子设备在复杂电磁环境中稳定运行的关键环节,其核心在于评估设备产生的电磁干扰(EMI)强度。辐射发射测试作为EMC测试的重要组成部分,通过测量设备向空间辐射的电磁噪声,判断其是否符合国际标准限值。测试原理基于电磁波的极化特性,即电场矢量的振动方向,主要分为垂直极化和水平极化。理解极化特性对于精准定位辐射源、高效进行EMC整改具有重要技术价值。在工程实践中,垂直极化噪声通常源于线缆辐射等垂直结构,而水平极化噪声多来自PCB走线等水平结构。通过分别测量两种极化方向的辐射最大值,可以全

weixin_32770423的博客 353

背包dp模板

01背包 #include<iostream> #include<cstring> using namespace std; const int maxn=1e5+1000; int n,m; int v[maxn],w[maxn]; int dp[maxn]; int main(){ cin>>n>>m; memset(dp,0,sizeof(...

Hello World 273

Office LTSC 2021/2024专业部署:ODT+config.xml标准化实战

Office部署本质上是企业终端软件生命周期管理的关键环节,其核心原理在于通过声明式配置驱动安装、激活与组件裁剪。Office Deployment Tool(ODT)作为微软官方命令行引擎,配合config.xml这一DSL契约文件,实现可版本控制、可审计、可回滚的自动化交付。该方案技术价值突出体现在稳定性保障(如LTSC长期支持通道)、合规性强化(不绕过授权机制)及运维提效(批量部署、离线支持)。典型应用场景覆盖教育机房批量装机、政企终端标准化、医疗HIS工作站部署等对功能冻结与系统确定性要求严苛的环境

diaocuiguo2493的博客 559

dp——背包模板乱锅炖

1.经典背包模板 01背包 完全背包 多重背包 混合背包 分组背包

firesolider的博客 389

MT6826SGT-STD-R绝对值编码器深度解析:精准控制+灵活编程

本文详细介绍MT品牌的高性能绝对值编码器——MT6826SGT-STD-R。:区别于传统增量式编码器,绝对值输出无需掉电归零,开机即获准确位置数据。的核心优势,结合应用场景与选型指南,为工程师提供一站式解决方案参考。MT6826SGT-STD-R是一款专为工业级精密控制设计的。该设备广泛应用于伺服系统、机器人关节校准、自动化产线等领域。:15bit分辨率实现细腻的位置反馈;:通过专用编写器可自定义多项关键参数;:优化电路设计,适应复杂电磁环境。

2501_93066786的博客 676

Aitoearn内容营销的最佳开源 AI 代理,创建 · 发布 · 互动 · 副业一站式平台,支持渠道:抖音、小红书(红点)、微信通道、快手、哔哩哔哩、微信公众号、抖音等等

Aitoearn内容营销的最佳开源 AI 代理,创建 · 发布 · 互动 · 副业一站式平台,支持渠道:抖音、小红书(红点)、微信通道、快手、哔哩哔哩、微信公众号、抖音等等

struggle2025的博客 1749

DP背包问题模板

DP:背包问题模板01背包问题暴力写法(朴素写法)空间优化后的代码完全背包问题 01背包问题 有N件物品和一个容量为V的背包,每件物品只能使用一次 第i件物品的体积是v[i],价值是w[i]。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大,输出最大价值。 数据范围:n,m,v[i],w[i]<=1000 代码如下: 暴力写法(朴素写法) //01背包模板 #inc...

weixin_46750633的博客 479

WindTerm 安装使用教程

WindTerm是一款Github上开源的 SSH 终端工具,它是完全可以比肩MobaXterm工具的。

m0_69576880的博客 4024

DP模板整理—背包、线性、区间、计数类

一、背包问题 01背包问题 题解: ACM_01背包(恰好装满) 解题思路:求01背包恰好装满时得到的最大价值,应该这样初始化:①dp[0]=0,表示背包容量为0时得到的最大价值也为0;②dp[1~W]=-inf,表示背包容量为其他状态下都为非法状态(未装满),因为我们还要求解恰好装满的情况下得到的最大价值。那么在求解过程中,由于动规的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解,所以如果子问题状态是非法的(-inf),则当前问题的状态依然非法,即不存在恰好装满

ZVAF_的博客 1674

【论文复现】——基于改进FPFH特征提取的点云模板匹配方法

基于改进FPFH特征提取的点云模板匹配方法 [J]. 应用激光, 2024, 44 (04): 196-204.

点云侠的博客 611

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

01背包,多重背包,打家劫舍, dp模板

dp,背包,打家劫舍问题,买卖股票问题,子序列问题

x1653673086的博客 606

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

dp(背包问题模板)

公式f[i][j]=max(f[i-1][j],f[i][j-v[i]]+w[i]从dfs----->记忆化搜索-------->dp(动态规划)记忆化搜索的一个模板:就拿01背包举例。每个物品的有一定的件数。每个物品可以选无限次。

2402_87490077的博客 276

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

dp 背包问题 模板

https://www.kancloud.cn/kancloud/pack/70131 //巨佬讲解 01背包1.1 题目 有N 件物品和一个容量为V 的背包。放入第i 件物品耗费的费用是Ci,得到的 价值是Wi。求解将哪些物品装入背包可使价值总和最大。 1.2 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即F[...

b03188460的博客 269

dp 完全背包模板

完全背包

ale_upcer的博客 666

四大基础背包DP问题模板

01背包,完全背包,多重背包,分组背包。

HHT0618的博客 240

蓝桥杯国赛动态规划模板:从背包到状压DP的实战指南

动态规划(DP)是解决最优化问题的核心算法思想,其原理在于将复杂问题分解为重叠子问题,并通过状态转移方程递推求解。该技术在算法竞赛和工程实践中具有极高价值,广泛应用于资源分配、路径规划、序列分析等场景。本文聚焦于算法竞赛高频考点,深入解析背包问题、线性DP、区间DP及状态压缩DP等经典模型。针对蓝桥杯国赛等高压环境,提供了模块化、场景化的DP模板,旨在帮助选手快速识别问题特征,套用经过验证的代码框架,从而将思考重心从底层实现转移到模型应用与优化上,有效提升解题效率和代码正确率。

weixin_30522983的博客 278

dp 01背包,完全背包,多重背包 模板

转自http://www.cppblog.com/tanky-woo/archive/2010/07/31/121803.html 首先说下动态规划,动态规划这东西就和递归一样,只能找局部关系,若想全部列出来,是很难的,比如汉诺塔。你可以说先把除最后一层的其他所有层都移动到2,再把最后一层移动到3,最后再把其余的从2移动到3,这是一个直观的关系,但是想列举出来是很难的,也许当层数n=3时还可以模拟

zxy160的博客 808

背包DP的标准代码模板

关于背包DP的标准代码 1、01背包 2、完全背包 3、多重背包 4、混合背包 5、泛化物品

Center_Braps的博客 777
上一篇: AC自动机模板
下一篇: 树的公共祖先(LCA)模板
Aidensunking
博客等级 码龄3年 34粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值