洛谷——P1731 [NOI1999]生日蛋糕

P1731 [NOI1999]生日蛋糕

搜索+剪枝

常见的剪枝:

若当前状态+后面所要搜索的最差的状态$>$或是$<$最后的状态,就返回

预处理最差的状态

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib> using namespace std; //const double pi=3.1415926535; int n,m;
int h[],r[],S,t_h,s_v[]; void dfs(int k,int s,int v){ if(s+r[m]*r[m]>S) return;
if(k==){if(v==n){S=s+r[m]*r[m];}return;}
if(v+(r[k+]-)*(r[k+]-)*(h[k+]-)*k<n) return;
if(v+s_v[k]>n) return; for(int i=r[k+]-;i>=k;i--){
for(int j=h[k+]-;j>=k;j--){
if(v+i*i*j<=n)
{
r[k]=i,h[k]=j;
dfs(k-,s+*i*j,v+i*i*j);
r[k]=,h[k]=;
}
}
}
} int main()
{
scanf("%d%d",&n,&m);
t_h=sqrt(n);
r[m+]=h[m+]=t_h;
S=0x7fffffff;
for(int i=;i<=m;i++) s_v[i]=i*i*i+s_v[i-];
dfs(m,,); printf("%d\n",S); return ;
}
上一篇:(CLR-Via-C#) 类型基础


下一篇:[NOI1999]生日蛋糕(搜索)