1.最优性剪枝
2.可行性剪枝
3.构建正三角,加大剪枝效率。
4.排列->组合
5.若某分支验证成功,则其他分支不必继续执行。
6.预处理无效数据
7.记忆化搜索(牺牲空间换时间)
e.g.
小木棍 - 洛谷https://www.luogu.com.cn/problem/P1120
#include<bits/stdc++.h>
using namespace std;
int n,a[51],sum,maxx,num,ans;
bool flag;
inline int read(){
int x=0;
char c=getchar();
while(isdigit(c)){
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}
return x;
}
void dfs(int step,int len,int last){
//#1
if(len>ans)return;
if(step==num+1){
flag=true;
return;
}
if(len==ans){
dfs(step+1,0,maxx);
if(flag)return;
}
else{
//#3
for(int i=last;i>=1;i--){
if(!a[i])continue;
a[i]--;
dfs(step,len+i,i);
a[i]++;
//#5
if(flag)return;
//#2
if(len==0||len+i==ans)return;
}
}
}
int main(){
n=read();
for(int i=1;i<=n;i++){
int x=read();
if(x>50)continue;
a[x]++,sum+=x;
if(x>maxx)maxx=x;
}
for(int i=maxx;i<=sum/2;i++){
if(sum%i)continue;
ans=i;
num=sum/i;
dfs(1,0,maxx);
if(flag){
printf("%d",ans);
return 0;
}
}
printf("%d",sum);
return 0;
}
//1.最优性剪枝
//2.可行性剪枝
//3.构建正三角,加大剪枝效率。
//4.排列->组合
//5.若某分支验证成功,则其他分支不必继续执行。
//6.预处理无效数据
//7.记忆化搜索(牺牲空间换时间)
又例如
[SCOI2005]栅栏 - 洛谷https://www.luogu.com.cn/problem/P2329
#include<bits/stdc++.h>
using namespace std;
int m,n,a[51],b[1001],sumb[1001],lt=1;
long long suma;
bool dfs(int now,int st){
if(sumb[now]>suma)return false;//#1
if(now==0)return true;//#2
bool flag=false;
for(int i=st;i<=m;i++){
if(a[i]>=b[now]){
a[i]-=b[now];
suma-=b[now];
if(a[i]<b[1])suma-=a[i];//#6
if(b[now -1]==b[now])flag=flag||dfs(now-1,i);
else flag=flag||dfs(now-1,lt);
if(a[i]<b[1])suma+=a[i];
a[i]+=b[now];
suma+=b[now];
}
if(flag)return true;//#5
}
return flag;
}
int main(){
scanf("%d",&m);
for(int i=1;i<=m;i++)scanf("%d",&a[i]),suma+=a[i];
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
sort(a+1,a+1+m);
sort(b+1,b+1+n);//#4
for(int i=1;i<=n;i++)sumb[i]=sumb[i-1]+b[i];
while(a[lt]<b[1]&<<=m)lt++;//#6
while(a[m]<b[n]&&n)n--;//#6
int l=1,r=n,ans=0,mid;
while(l<=r){
mid=(l+r)/2;
if(dfs(mid,lt))ans=mid,l=mid+1;//#3
else r=mid-1;
}
printf("%d",ans);
return 0;
}
//1.最优性剪枝
//2.可行性剪枝
//3.构建正三角,加大剪枝效率。
//4.排列->组合
//5.若某分支验证成功,则其他分支不必继续执行。
//6.预处理无效数据
//7.记忆化搜索(牺牲空间换时间)
谢谢观看。