教你学c++算法题中最头疼的动态规划

之前刷题目的时候,最头疼的就是动态规划类型的题目了,一开始一点思绪想法都没有
想看数学题一样痛苦不堪而且一点同情都没有,数学题起码还有选择题可以蒙,这蒙也蒙不了
勉强哗啦啦打个暴力上去一测,好家伙只有几个可怜的样例点过了
那么动态规划为啥那么难呢?
先上一段百度百科对动态规划的解释
动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域,并在背包问题、生产经营问题、资金管理问题、资源分配问题最短路径问题和复杂系统可靠性问题等中取得了显著的效果
简单来说就是对于多个阶段决策过程中的最优化思想
这样听是不是有点头疼?
先上个开胃小菜~~~

题意:在一个国家仅有1分,2分,3分硬币,将n(n>=3)分钱兑换成硬币有很多种兑法。求有多少种兑换方式。

我第一次看这个题的时候被难成傻der了~~~,不过其实可以把他当做一个简单的小学数学题做(确信)🤣
那就先讲小学做法吧(hhh)
第一种解法通过枚举3的个数,当你已知3的个数就可以求出2的个数,以此类推,3的个数确定,2的个数也可以确定,剩下的就是1啦~~~~假设3的个数为i(0<=i<=n/3),那么2的个数就是再然后1的个数就确定了。
#include<bits/stdc++.h>
using namespace std;
int  main()
{
	int n;
	while(cin>>n){
		int i,j,ans=0;
		for(i=0;i<=n/3;i++){
			int temp=(n-3*i);     
			ans+=temp/2+1;        
		}
		cout<<ans<<endl;
	}
}
是不是突然一拍脑门,心想就这?那来看看第二种解法吧~
第二种解法:是类似完全背包dp, 比较经典的dp问题,外层循环是硬币的价值,可以一个一个枚举,如果i=1,那么则一直放1,求出方案数,其他同理。hhhh是不是有点难懂了?
#include<bits/stdc++.h>
using namespace std;
const int maxn=32768+10000;
int dp[maxn];
int main()
{
	int n,i,j;
	while(~scanf("%d",&n)){
		memset(dp,0,sizeof(dp));
		dp[0]=1;
		for(i=1;i<=3;i++){
			for(j=i;j<=n;j++){
				dp[j]+=dp[j-i];
			}
		}
		cout<<dp[n]<<endl;
	}
}

那先上一道比较简单而且经典的吧~

m个苹果放在n个盘子里面有多少种放法?(动态规划)


设f(m,n) 为m个苹果,n个盘子的放法数目,则先对n作讨论,如果n>m,必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响;
即if(n>m) f(m,n) = f(m,m)  当n<=m时,不同的放法可以分成两类:即有至少一个盘子空着或者所有盘子都有苹果,前一种情况相当于f(m,n) = f(m,n-1);
后一种情况可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即f(m,n) = f(m-n,n).
而总的放苹果的放法数目等于两者的和,即f(m,n) =f(m,n-1)+f(m-n,n)。边界条件为m=0或n=1时,只有一种放法。
#include<bits/stdc++.h>
using namespace std;
int fun(int m,int n){
	if(m==0||n==1)
		return 1;
	if(m<n)
		return fun(m,m);
	else
		return fun(m,n-1)+fun(m-n,n);	
}
int main(){
	int m,n,t;
	cin>>t;
	while(t--){
		cin>>m>>n;
		cout<<fun(m,n)<<endl;
	}
	return 0;
}

全部看完之后,是不是觉得自己dp已经小成了~~~~
最后上一道家庭作业hhhh很久之前的HDU的题了

稍微讲一下思路吧~从终点判,蜜蜂每次只能从前1个蜂房或者前2个蜂房过来所以:dp[i]=dp[i-1]+dp[i-2];再数出终点和起点相差的格子数为b-a+1,记得开longlong。



#C/C++##用DP写的##面试题目#
全部评论
坏了 我连小学数学 的第一个代码都看不懂了  问下 3的种类数 是啥意思?是1分,2分,5分的个数都不为0的情况吗?
1 回复 分享
发布于 2022-07-05 20:07
1 回复 分享
发布于 2022-06-30 10:36
1 回复 分享
发布于 2022-07-01 07:21
1 回复 分享
发布于 2022-07-02 13:10
DP,yyds
1 回复 分享
发布于 2022-07-02 18:54
个数说成种类数,五分硬币变成三分,x又变成i,懂得也让你整不懂了
1 回复 分享
发布于 2022-07-07 07:31
一看就懂,一用就废
1 回复 分享
发布于 2022-07-13 22:13
😘😘😘😘
点赞 回复 分享
发布于 2022-06-30 10:39

相关推荐

一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
铁锈不腻玩家:下面那个袁先生删了,问他怎么回事,头像都换不明白
点赞 评论 收藏
分享
评论
28
53
分享
正在热议
# 25届秋招总结 #
440577次浏览 4493人参与
# 春招别灰心,我们一人来一句鼓励 #
41503次浏览 524人参与
# 阿里云管培生offer #
119866次浏览 2219人参与
# 地方国企笔面经互助 #
7928次浏览 18人参与
# 同bg的你秋招战况如何? #
75577次浏览 552人参与
# 虾皮求职进展汇总 #
114215次浏览 884人参与
# 北方华创开奖 #
107312次浏览 599人参与
# 实习,投递多份简历没人回复怎么办 #
2454001次浏览 34848人参与
# 实习必须要去大厂吗? #
55678次浏览 960人参与
# 提前批简历挂麻了怎么办 #
149825次浏览 1977人参与
# 投递实习岗位前的准备 #
1195707次浏览 18546人参与
# 你投递的公司有几家约面了? #
33180次浏览 188人参与
# 双非本科求职如何逆袭 #
661910次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4730次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157604次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11365次浏览 270人参与
# 发工资后,你做的第一件事是什么 #
12418次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35612次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20091次浏览 240人参与
# 我的上岸简历长这样 #
451924次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39235次浏览 314人参与
# 非技术岗是怎么找实习的 #
155850次浏览 2120人参与
牛客网
牛客企业服务