• 经典搜索 剪枝 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;
    }
    

      

  • 相关阅读:
    python requests用法总结
    Linux统计某文件夹下文件的个数
    PM2使用及介绍
    如何区分USB 2.0 和USB 3.0插口
    npm突然找不到npm-cli.js的解决方法
    mRemoteNG
    js中几种实用的跨域方法原理详解
    Tornado异步阻塞解决方案
    [阅读笔记]EfficientDet
    iOS 保存视频AVAssetWriter
  • 原文地址:https://www.cnblogs.com/jackes/p/2422069.html
Copyright © 2020-2023  润新知