小木棍

深度优先搜索

小木棍

int cnt=0;
bool dfs(int len,int now,int used,int last)//枚举的长度 现在拼的长度 使用的棍棒数量 
{
	if((used==n)&&(now==len))  return 1;
	if(now==len)
	{
		int fail=0;
		for(rint i=1;i<=n;i++)
		{
			if(vis[i]) continue; if(a[i]==fail) continue;
			vis[i]=1;
			if( dfs(len,a[i],used+1,i+1) ) return 1;//这一根总是要用的 这次失败下次也要失败( 等效状态下的失败) 
			vis[i]=0; fail=a[i];
			return false;
		}
	}
	else
	{
		int fail=0;
		for(rint i=last;i<=n;i++)
		{
			if(vis[i]) continue; if(a[i]==fail) continue;
			if(now+a[i]<=len)
			{
				vis[i]=1;
				if( dfs(len,now+a[i],used+1,i+1) ) return 1; 
				vis[i]=0; fail=a[i];
				if(now==0||now+a[i]==len) return 0;
			
			}
		}	
	}
	return 0;
}

以为把所有的now=0 的情况都划到了now==len的情况 但是实际上你最开始是按照0开始搜索的 导致最初的那个状态没有被剪枝

准确的来说 应该是剪枝没有剪彻底 分类讨论的时候漏了情况

搜索的时候不是按照第一根来搜的 是从第0根开始搜索的

原文链接: https://www.cnblogs.com/juruoHBr/p/15831710.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    小木棍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/187138

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 上午11:15
下一篇 2023年2月12日 上午11:15

相关推荐