首页 > 其他分享 >P1164-DP【橙】

P1164-DP【橙】

时间:2023-11-02 11:11:06浏览次数:30  
标签:considered money DFS P1164 include meal DP

这道题让我更深入的理解了记忆化搜索的过程,既然记忆化搜索的结果要靠返回值来传递,那么记忆化搜索解决问题的必须是倒序的,即记忆化搜索是一个简化问题倒序解决的过程,普通搜索是一个复杂化问题逐步尝试并记录尝试结果的过程。
特别是对于求总种数的记忆化搜索,就是把能干的事情组合起来然后把情况全都加到DFS变量中,然后直接return DP[*][*]=DFS即可。同时异常剪枝可以直接在递归搜索中进行。只进行常规的记忆化剪枝就可以。当然异常剪枝和搜索时判断边界同时来做,双重保险也是可以的。

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;
int N,M,DP[1005][1005],a[1005];

int dfs(int money,int considered_meal)//money is the rest money ;return_value is the count of how much way i can buy
{
	//记忆化剪枝
	if(DP[money][considered_meal]!=-1)return DP[money][considered_meal];
	//cout<<money<<' '<<considered_meal<<endl;

	//递归搜索,核心思想是求总种数就"能干啥干啥,不能就拉倒不用管"
	int DFS=0;
	//能干的事情的组合如下
	//继承且买
	if(money-a[considered_meal]>0&&considered_meal-1>0)DFS+=dfs(money-a[considered_meal],considered_meal-1);
	//买但不继承
	if(money-a[considered_meal]==0)DFS+=1;
	//继承但不买
	if(considered_meal-1>0)DFS+=dfs(money,considered_meal-1);

	return DP[money][considered_meal]=DFS;
}

int main()
{
	cin>>N>>M;
	memset(DP,-1,sizeof(DP));DP[0][0]=0;
	for(int i=1;i<=N;i++)
	{
		cin>>a[i];
	}
	cout<<dfs(M,N)<<endl;
    return 0;
}

标签:considered,money,DFS,P1164,include,meal,DP
From: https://www.cnblogs.com/gongkai/p/17804964.html

相关文章

  • matplotlib 设置图形大小 figsize dpi
    figure语法说明figure(num=None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True)num:图像编号或名称,数字为编号,字符串为名称figsize:指定figure的宽和高,单位为英寸dpi:指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80,1英寸等于2.5cm,A4纸是21......
  • Qt通过UDP发送广播
      //x.hQUdpSocket*udp=nullptr;//UDP对象voidcreateUdpAndSendData();//创建UDP对象和发送广播数据voiddropUdp();//释放UDP对象voidreadData();//用来接收其他设备发送的数据voidcreateUdpAndSendData(){......
  • P1216-DP【橙】
    在这道题中,我第一次用了memset,确实方便,不过需要注意的是只有全部赋值-1和0的时候才能使用它,否则他能干出吓死人的事。以及memset在cstring头文件里,在本地就算不include也能照常编译,但评测机里可能不行,所以一定要写上cstring同时,我半获得半自我总结了一个暴论,这个暴论直接让我理解......
  • 验证2个节点udp和tcp可通性
    -u表示udp,默认是tcp。-l表示作为server监听。server:192.168.0.104上开启udp123端口server发送11client:连接192.168.0.104上udp123端口client发送100 server:192.168.0.104上开启tcp123端口server发送102client:连接192.168.0.104上tcp123端口client发送101......
  • ThreadPoolExecutor使用浅谈
    1.基础介绍ThreadPoolExecutor是Python标准库concurrent.futures模块中的一个类,用于实现线程池的功能。ThreadPoolExecutor模块相比于threading等模块,通过submit方法返回的是一个Future对象,它代表了一个未来可期的结果。通过Future对象,我们可以在主线程(或主进程)中获取某个线程(......
  • DP查缺补漏之多重背包优化原理
    DP查缺补漏之多重背包优化原理普通思路类似完全背包for(inti=1;i<=n;i++)for(intj=1;j<=V;j++)for(intk=1;k<=V/c[i];k++){if(k*c[i]<=j)f[i][j]=max(f[i-1][j],f[i-1][j-k*c[i]]+k*w[i]);......
  • poj 2411 状压dp入门题
    Mondriaan'sDreamTimeLimit:3000MS MemoryLimit:65536KTotalSubmissions:29096 Accepted:15505DescriptionSquaresandrectanglesfascinatedthefamousDutchpainterPietMondriaan.Onenight,afterproducingthedrawingsinhis�......
  • UDP 协议
    UDP协议UDP(UserDatagramProtocol),目标是在传输层提供直接发送报文(Datagram)的能力。Datagram是数据传输的最小单位。UDP协议不会帮助拆分数据,它的目标只有一个,就是发送报文。   与tcp差异  ......
  • CF练习题17(DP)
    ChocolateBar我们看到\(n,m\le30\)想到暴搜。考虑枚举分割线,一直到刚好满足需要或者只有一个巧克力的情况。随手跑了个最优解。inlineintdfs(intn,intm,intk){ if(n*m==k)return0; if(k<=0)return0; if(f[n][m][k]<inf)returnf[n][m][k]; intres=inf; up(i,......
  • DP查缺补漏之01背包优化原理
    DP查缺补漏之01背包优化原理先复习一下基本知识状态假设DP[I][J]为前\(i\)个物品,容量小于\(j\)时的最优解(最大价值)状态转移DP[I][J]=max(DP[I-1][J],DP[I-1][J-V[I]]+W[I])对于第\(i\)个物品,两种可能装入背包则状态应通过前\(i-1\)个物品,容量小于\(j......