首页 > 其他分享 >搜索剪枝

搜索剪枝

时间:2023-10-01 17:11:26浏览次数:36  
标签:剪枝 return int leq 搜索 木棍 rn

虽然我很懒,但集训期间还是强迫我自己写一下博客吧!


搜索剪枝

不搜不知道,我的搜索如同一坨shift。

搜索没逻辑,剪枝随便捡,然后喜提 with return value 3221225725


P1025数的划分

非常简单的一道,数的拆分题

题目描述

将整数 \(n\) 分成 \(k\) 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。

例如:\(n=7\),\(k=3\),下面三种分法被认为是相同的。

\(1,1,5\);
\(1,5,1\);
\(5,1,1\).

问有多少种不同的分法。

为了防止重复,很明显我们要保证后一个数大于等于前一个数,另外判断一下剩下的n除以剩下的个数,是不是大于等于这个数。

void finding(int minn,int kn,int rn){
	if(kn==1&&rn>=minn){
		ans++;
		return ;
	}
	for(int i=minn;i<=n;i++){
		if(rn-i>=0&&(double)(rn-i)/(kn-1)>=minn) finding(i,kn-1,rn-i);
	}
	return ;
}

P1120 小木棍

哇,这题苦战两小时,没结果,就先放一放。一想头就炸,有点恐怖。

又经过一个小时苦苦挣扎,分数最高终于来到了81(哭死

image

题目描述

乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过 \(50\)。

现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。

给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。

对于全部测试点,\(1 \leq n \leq 65\),\(1 \leq a_i \leq 50\)。

解题思路

这道题最麻烦的是我要用一堆数,拼凑出几个大小相同的数,至于到底是几个呢不知道。

不过由于这些木棍必须刚好用完,所以最短就是最长的木棍,最长就是所有木棍的和。

所以枚举我的目标木棍长度,然后暴力枚举拼凑,然后理所当然就要剪枝。

先把我的78分代码放这吧,思路很明了,但剪枝优化还不够

#include<bits/stdc++.h>
using namespace std;
int n,a[100],cnt,ans,sum,maxn,len;
int nex[100];
bool vis[100];

bool cmp(int x,int y){
	return x>y;
}

bool check(int stick,int cab,int last){//stick表示当前正在凑第几根木棒 
	if(stick>cnt) return 1;            //cab表示正在凑的这根木棒已经凑了多长 
	if(cab==len) return check(stick+1,0,1);//last表示最后使用的小木棒标号 
	for(int i=last;i<=n;i++){
		if(!vis[i]&&cab+a[i]<=len){
			vis[i]=1;
			if(check(stick,cab+a[i],i+1)) return 1;
			vis[i]=0;
			if(cab==0) return 0;
			i=nex[i];
		}
	}
	return 0;
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		maxn=max(maxn,a[i]);
		sum+=a[i];                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
	}
	ans=sum;
	sort(a+1,a+1+n,cmp);
	int now=n;
	nex[n]=n;
	for(int i=n-1;i>=1;i--){
		if(a[i]!=a[i+1]){
			now=i;
		}
		nex[i]=now;
	}
	for(int i=maxn;i<=sum;i++){
		if(sum%i!=0) continue;
		cnt=sum/i;
		len=i;
		memset(vis,0,sizeof(vis));
		if(check(1,0,1)){
			ans=i;
			break;
		}
	}
	printf("%d",ans);
	return 0;
}

标签:剪枝,return,int,leq,搜索,木棍,rn
From: https://www.cnblogs.com/alloverzyt/p/17739009.html

相关文章

  • 33. 搜索旋转排序数组
    整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,4,5,6,7]在下标3处经......
  • 搜索优化
    一、什么是剪枝     首先应当明确的是,“剪枝”的含义是什么。我们知道,搜索的进程可以看作是从树根出发,遍历一棵倒置的树——搜索树的过程。而所谓剪枝,顾名思义,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是剪去了搜索树中的某些“枝条”,故称剪枝。我们在编写搜......
  • Go每日一库之140:Zinc(轻量级搜索引擎)
    ‍项目介绍Zinc是一个轻量级替代Elasticsearch的开源搜索引擎。Elasticsearch真的好用,但是Elasticsearch安装和配置也是真的繁琐,后续的一些维护也有一定成本。另外一个Elasticsearch的不足就是服务运行起来需要的计算资源较多,对于普通的用户来说是有点浪费的。Zinc,拥有......
  • 74. 搜索二维矩阵
    给你一个满足下述两条属性的mxn整数矩阵:每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。给你一个整数target,如果target在矩阵中,返回true;否则,返回false。示例1:输入:matrix=[[1,3,5,7],[10,11,16,20],[23,30,34,60]],targ......
  • 基于vue和element-ui的搜索下拉滚动条组件
    ......
  • 【略施小计】Pycharm2022取消双击shift搜索框
    Pycharm取消双击shift搜索框基于PyCharm2022.3.2(ProfessionalEdition),旧版本修改方式自行搜索双击shift弹出搜索框,输入内容doublemodifier,单击对应项勾选上,意味着禁止双击修改快捷键shift-shift随处搜索失效ctrl-ctrl运行任何内容失效最后应用保存即可。......
  • ChatGPT 重磅更新可进行实时网络搜索;OpenAI 将构建新的“AI 硬件”丨RTE开发者日报 Vo
    开发者朋友们大家好:这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,欢迎大家留......
  • 记忆化搜索
    记忆化搜索记忆化搜索是啥:不依赖任何外部变量答案以返回值的形式存在,而不能以参数的形式存在(就是不能将dfs定义成dfs(pos,tleft,nowans),这里面的nowans不符合要求).对于相同一组参数,dfs返回值总是相同的说白了,记忆化搜索就等于动态规划,只不过换了种方......
  • 利用字典树实现搜索提示词
    利用字典树构建搜索提示,主要一点是在项目中字典的数据加载。@GetMapping("/searchCues")@Operation(summary="搜索提示词")publicResultsearchCues(Stringkeys){try{if(keys.isEmpty()){returnnull;}......
  • 79. 单词搜索
    给定一个mxn二维字符网格board和一个字符串单词word。如果word存在于网格中,返回true;否则,返回false。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例1:输......