首页 > 其他分享 >动态规划基础笔记

动态规划基础笔记

时间:2024-02-15 12:55:21浏览次数:26  
标签:背包 const int d% 笔记 问题 include 动态 规划

背包问题


 

01背包

 

 一般的动态规划要先考虑好状态,这个状态是一个集合,要能分成几个子集,然后从这些子集(小问题),推到这一整个集合(大问题),且求解过程是一样的,就可以可以转换成大问题分解成小问题一个一个求解,最后合并

先要知道状态表示什么

再要知道dp的属性,应该跟所求有关,只会有最大值,最小值,和数量的情况。

然后要知道你这个问题集合里,能从小问题推到大问题这个条件是什么(满足这个条件,才能推过来),还有是从哪些大问题,化解成的小问题

还有状态计算,也就是问题集合的划分,把每一种情况算出来,要求不重,不漏

有一些状态需要拐个弯才能求解,比如说含i,可以先求不含i,最后再补上i,是等价的

但是注意,有些集合划分出来的可能是空集,也就是不存在,就必须j<vi的时候,j-vi就不存在了,写代码的时候要注意一下

 

例题

[AcWing] 2. 01背包问题(C++实现)0-1背包问题模板题_c++0-1背包模版-CSDN博客

 二维

#include <bits/stdc++.h>
using namespace std;

const int N=1005;
int n, m, v[N], w[N], f[N][N];
int main() 
{
	scanf("%d%d", &n, &m);
	for (int i=1; i<=n; i++) scanf("%d%d", &v[i], &w[i]);
	
	//f[0][0~m]=0
	
	for (int i=1; i<=n; i++)
		for (int j=0; j<=m; j++)
		{
			f[i][j]=f[i-1][j];
			if (j>=v[i]) f[i][j]=max(f[i][j], f[i-1][j-v[i]]+w[i]);
		}
	
	printf("%d", f[n][m]);
	return 0;
}

  

一维写法(滚动优化)

由于第i件物品只跟第i-1件物品有关,每次都是这件跟前一件有关,所以先去掉一维

 

#include <bits/stdc++.h>
using namespace std;

const int N=1005;
int n, m, v[N], w[N], f[N];
int main() 
{
	scanf("%d%d", &n, &m);
	for (int i=1; i<=n; i++) scanf("%d%d", &v[i], &w[i]);
	
	//f[0][0~m]=0
	
	for (int i=1; i<=n; i++)
		for (int j=0; j<=m; j++)
		{
			f[j]=f[j]; //这里是没啥用的,可以删掉
			if (j>=v[i]) f[j]=max(f[j], f[j-v[i]]+w[i]); //删掉上一行之后,我们发现这里j可以直接从v[i]开始遍历
		}
	
	printf("%d", f[m]);
	return 0;
}

  整理一下变成

#include <bits/stdc++.h>
using namespace std;

const int N=1005;
int n, m, v[N], w[N], f[N];
int main() 
{
	scanf("%d%d", &n, &m);
	for (int i=1; i<=n; i++) scanf("%d%d", &v[i], &w[i]);
	
	//f[0][0~m]=0
	
	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]);
		
	
	printf("%d", f[m]);
	return 0;
}

  但是这样是不对的,关键在于j循环的顺序   举例证明的方法:AcWing 2. 01背包问题 - AcWing 

看完举例的方法之后,你就会发现,这句话等价与

f[i][j]=max(f[i][j], f[i][j-v[i]]+w[i]);

但是和原来不符,原因是从小打大循环时,会出现前面值被改的情况,但是从大到小就可以保证前面值不会改变

终极写法:

#include <bits/stdc++.h>
using namespace std;

const int N=1005;
int n, m, v[N], w[N], f[N];
int main() 
{
	scanf("%d%d", &n, &m);
	for (int i=1; i<=n; i++) scanf("%d%d", &v[i], &w[i]);
	
	//f[0][0~m]=0
	
	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]);
		
	
	printf("%d", f[m]);
	return 0;
}

  

完全背包

 

标签:背包,const,int,d%,笔记,问题,include,动态,规划
From: https://www.cnblogs.com/didiao233/p/18016165

相关文章

  • 思源笔记—代码片段
    Vue引用主题样式.protyle-wysiwyg[data-node-id].bq,.b3-typographyblockquote{border-left:0.25emsolid#5ebc1d!important;border-radius:0em0.31em0.31em0.em;background-color:rgb(10624190/5%)!important;margin-top:8px!important......
  • 动态规划题目合集
    3n多米诺问题\(dp[i]\)表示前\(i\)列的方案数,\(dp2[i]\)表示前\(i\)列但是最上面一行缺一个的方案数。\(dp[i],dp2[i]\)可以相互递推,而且刚好是矩阵递推。矩阵快速幂优化。Walk有向无权图。求长度\(k\)的路径条数。我们发现邻接矩阵的\(k\)次方各个元素求和就是......
  • 基础图论笔记
    二分图  染色法  例题ACwing860-染色法判断二分图(染色法)-CSDN博客给定一个n个点m条边的无向图,图中可能存在重边和自环。请你判断这个图是否是二分图。输入格式第一行包含两个整数n和m。接下来m行,每行包含两个整数u和v,表示点u和点v之间存在一条边。输出格式如......
  • Go语言精进之路读书笔记第27条——尽量定义小接口
    接口越大,抽象程度越低——RobPike,Go语言之父27.1Go推荐定义小接口无论标准库还是社区项目,都遵循了“尽量定义小接口”的建议,方法数量在1~3个范围内的接口占了绝大多数。27.2小接口的优势1.接口越小,抽象程度越高,被接纳度越高抽象程度越高,对应的集合空间越大。无方法的......
  • 【阅读笔记】空域保边降噪《Side Window Filtering》
    1、保边滤波背景保边滤波器的代表包括双边滤波、引导滤波,但是这类滤波器有一个问题,它们均将待处理的像素点放在了方形滤波窗口的中心。但如果待处理的像素位于图像纹理或者边缘,方形滤波核卷积的处理结果会导致这个边缘变模糊。基于这个观察,《SideWindowFiltering》的作者提出......
  • 2023北京集训 做题笔记
    2023北京集训做题笔记动态规划CF1610HSquidGame钦定\(1\)为根,发现如果\(u,v\)不为祖先后代关系,则选择根能把它们全部消掉剩下的\(u,v\)均为祖先后代,假设\(u\)为祖先如果在一条链上,问题转化为选择尽量少的点覆盖所有线段,与端点重合不算常规做法是按右端点排序,每次......
  • 2024.1 省选集训题单笔记
    CF513E2SubarrayCuts一开始还以为有什么神仙性质,找了半天发现性质不好,要考虑一些暴力点的做法了相邻两段和之差的绝对值,这个限制很难处理我们只能考虑把贡献拆开,如果把每段的位置与和标在一张折线图上,我们发现这张图中的「山峰」产生\(+2\)的贡献,「山谷」产生\(-2\)的贡......
  • NOIP2023 集训做题笔记
    杂项CF1181E2AStoryofOneCountry(Hard)启发式分裂发现如果当前矩形中有一整行或一整列没有穿过城堡内部,就可以分为\(2\)部分而且分开后相当于限制减少,每次贪心的能分就分,朴素实现复杂度为\(O(n^2\logn)\),可通过easyversion考虑优化每次找分割点的过程如果分割点......
  • Codeforces 做题笔记
    1841EFilltheMatrix刚开始思路错了,以为就从下往上铺但发现要尽量让横的连续段断开的次数少,每断开一次相当于数量\(-1\)所以从宽度最大的矩形开始填,尽量填满可以用set维护当前行的连续段,这一列遇到黑格就split,去除宽度为\(1\)的,同时记录加入的时间戳来计算矩形高度vo......
  • vue 父传子 props 静态属性和动态属性
    Props静态属性<template> <div>   <ConpentA title="我是静态props"/> </div></template><script> importConpentAfrom'./components/ConpentA.vue' exportdefault{  components:{   ConpentA......