1. 程式人生 > >洛谷——P1731 [NOI1999]生日蛋糕

洛谷——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[20],r[20],S,t_h,s_v[15]; void dfs(int k,int s,int v){ if(s+r[m]*r[m]>S) return; if(k==0){if(v==n){S=s+r[m]*r[m];}return;} if(v+(r[k+1]-1)*(r[k+1]-1)*(h[k+1]-1)*k<n) return; if(v+s_v[k]>n) return; for(int i=r[k+1]-1;i>=k;i--){ for(int j=h[k+1
]-1;j>=k;j--){ if(v+i*i*j<=n) { r[k]=i,h[k]=j; dfs(k-1,s+2*i*j,v+i*i*j); r[k]=0,h[k]=0; } } } } int main() { scanf("%d%d",&n,&m); t_h=sqrt(n); r[m+1]=h[m+1]=t_h; S
=0x7fffffff; for(int i=1;i<=m;i++) s_v[i]=i*i*i+s_v[i-1]; dfs(m,0,0); printf("%d\n",S); return 0; }