• 经典搜索 剪枝 hdu 1518 Given a set of sticks of various lengths, is it possible to join them endtoend to form a square?


    主要是剪枝:分为总体和枝节

    总体:sum%4!=0,max<sum/4

    枝节:在于dfs的参数设置和条件判断,动态的判断是否进行

    参考代码(参考牛人的):

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int a[25],vist[25],m,ave,flag;
    
    int cmp(const void *a,const void *b)
    {
    	return (int *)b-(int *)a;
    }
    
    int dfs(int res,int sums,int cur)
    {
    	int i;
    	if(sums==ave)
    		return 1;
    
    	for(i=cur;i<m;i++)
    	{
    		if(a[i]==a[i-1]&&!vist[i-1])//相邻的相等的前者没有加入,则这个也不行
    			continue;
    
    		if(!vist[i]&&a[i]<=res)
    		{
    			vist[i]=1;
    
    			if(a[i]==res)
    			{	
    				if(dfs(ave,sums-a[i],0))
    				{
    				//	printf("%d\n",i);
    					return 1;
    				}
    			}
    			else if(dfs(res-a[i],sums-a[i],i))
    			{
    				return 1;
    			}
    
    			vist[i]=0;
    
    			if(res==ave)//ave没变,则表示不存在
    				return 0;
    		}
    	}
    
    	return 0;
    }
    
    int main()
    {
    	int n,i,sum;
    
    	scanf("%d",&n);
    
    	while(n--)
    	{
    		scanf("%d",&m);
    
    		sum=0;
    
    		for(i=0;i<m;i++)
    		{
    			scanf("%d",&a[i]);
    			sum+=a[i];
    		}
    
    		qsort(a,m,sizeof(int),cmp);
    
    		flag=0;
    
    		ave=sum/4;
    
    		if(a[m-1]>ave||sum%4)
    		{
    			printf("no\n");
    			continue;
    		}else
    		{
    			memset(vist,0,sizeof(vist));
    			if(dfs(ave,sum,0))
    				flag=1;
    		}
    
    		if(flag)
    			printf("yes\n");
    		else
    			printf("no\n");
    
    	}
    
    	return 0;
    }
    

      

  • 相关阅读:
    shell快捷键
    通过调整tcp参数来防范DDOS攻击
    解决 nf_conntrack: table full, dropping packet 的几种思路
    Linux系统资源限制
    解决Out of socket memory问题
    wrk简介
    部分 TCP 参数简介
    P1706 全排列问题
    P1149 [NOIP2008 提高组] 火柴棒等式
    P1104 生日
  • 原文地址:https://www.cnblogs.com/jackes/p/2422069.html
Copyright © 2020-2023  润新知