|
|
|
|
|
|
初次做DFS+剪枝的题,看了别人的博客以后自己尝试着写了一下,过了,16MS,剪枝还需改善,做了其他题以后再回来看这道题。
![]() Code 1 #include <iostream> 2 #include <algorithm> 3 #define MAXN 64 4 using namespace std; 5 6 int n, len, m; //LEN为原始棍子长度, M为原始棍子数量 7 int sticks[MAXN], used[MAXN]; 8 bool flag; 9 int cmp(int a,int b) 10 { return a>b; 11 } 12 13 14 int dfs(int k,int sum,int pos) //pos代表当前已拼凑的棍子数 15 { int j,pre; 16 if(pos==m) 17 flag=1; //标志已经分成了M根 18 else if(sum==len) 19 dfs(0,0,pos+1); //当前的一根拼好了 20 else{ 21 for(pre=-1,j=k;j<n;j++){ 22 if(!used[j]&&sticks[j]!=pre&&sum+sticks[j]<=len){ 23 pre=sticks[j]; 24 used[j]=1; 25 dfs(j+1,sum+sticks[j],pos); 26 used[j]=0; 27 if(k==0||flag) //我在这个地方很困惑注 28 return 0; 29 } 30 } 31 } 32 } 33 34 int main() 35 { int tot_len,i; 36 while(scanf("%d",&n)!=EOF&&n) 37 { memset(used,0,sizeof(used)); 38 flag=0; 39 tot_len=0; 40 for(i=0;i<n;i++){ 41 scanf("%d",&sticks[i]); 42 tot_len+=sticks[i]; 43 } 44 sort(sticks,sticks+n,cmp); 45 for(i=sticks[0];i<tot_len;i++) 46 if(tot_len%i==0){ 47 len=i; 48 m=tot_len/len; 49 dfs(0,0,0); 50 if(flag) 51 break; 52 } 53 printf("%d\n",flag?len:tot_len); 54 } 55 return 0; 56 } 困惑的地方后来想明白了,其实我自己看程序以后得到的USED[I]数组当最后拼凑完成的时候并没有全部被置为1
|
|