bool dfs(int count,int pos,int res)这是本题中DFS算法的状态。三个要素 count (已经拼好的棍子个数),pos (现在遍历的第几根棍子),res (要凑成目标长度剩余的长度)
goal = sum/4;标记的数组我们定义为used[21].值为 true 则标记过,即用过了。值为 false 则未用过。
//声明,全局 bool used[21]; //初始化为false,main函数中 memset(used,false,sizeof(used));下面看DFS函数的代码:
bool dfs(int count,int pos,int res) { if(count==3)//3根拼好就能保证都拼好 return true; for(int i=pos;i<t;i++)//DFS框架循环 { if(used[i])//1 continue; used[i] = true;//2 if(stick[i]==res)//3 {//DFS框架中的递归 if(dfs(count+1,0,goal))//4 return true; } else if(stick[i]<res)//5 {//DFS框架中的递归 if(dfs(count,i+1,res-stick[i]))//6 return true; } used[i] = false;//7 } return false; }//1:如果标记过就跳过下面过程
#include <iostream> #include <algorithm> using namespace std; bool used[21]; int stick[21]; int t,goal; bool cmp(int a,int b) { return a>b; } bool dfs(int count,int pos,int res) { if(count==3)//3根拼好就能保证都拼好 return true; for(int i=pos;i<t;i++)//DFS框架循环 { if(used[i]) continue; used[i] = true; if(stick[i]==res) { if(dfs(count+1,0,goal))//DFS框架中的递归 return true; } else if(stick[i]<res) { if(dfs(count,i+1,res-stick[i]))//DFS框架中的递归 return true; } used[i] = false; } return false; } int main() { int n; cin>>n; while(n--) { cin>>t; int sum=0; for(int i=0;i<t;i++) { cin>>stick[i]; sum+=stick[i]; } if(sum%4) { printf("no\n"); continue; } goal = sum/4; memset(used,false,sizeof(used)); sort(stick,stick+t,cmp); if(dfs(0,0,goal))//初始态 printf("yes\n"); else printf("no\n"); } return 0; }
原文:http://blog.csdn.net/guodongxiaren/article/details/23126997