PKU 2362

来源:互联网 发布:如何删除淘宝空间图片 编辑:程序博客网 时间:2024/06/06 15:43

这是网上的参考代码,自己做的时候没有思路,这道题的关键之处在于利用将所有的sticks的长度加起来,相加之后的结果可以作为编程过程之中的判断条件

#include <iostream>#include <algorithm>using namespace std;int n,m, s[25],sum;bool mark[25];bool cmp(int a, int b){    return a > b;}bool DFS(int cur_len, int k, int cur_num){if (cur_num == 4) return true;    //4条边全部还原成功,返回trueelse if (cur_len == sum) return DFS(0, 0, cur_num + 1);      //已完成当前一条边,还原下一条边else{int  i;//pre,pre = 0, for (i = k; i < m; i++){if (mark[i] && s[i] + cur_len <= sum){//当前木棍可用 //&& s[i] != pre       //pre = s[i];mark[i] = false;     //改变使用状态if (DFS(cur_len + s[i], i + 1, cur_num)) break;   //递归检测下一条木棍mark[i] = true;       //如果使用当前的木棍并不能成功还原的话,还原此木棍状态if (k == 0) return false; //回溯到第一根木棍仍然不能成功还原时,返回false}}if (i == m) return false; //一直到循环结束都无法还原边,则return falseelse return true;}}int main(){cin>>n;while(--n>=0){cin>>m;for (int i = sum = 0; i < m; i++){cin>>s[i];sum += s[i];}if(sum%4!=0){printf("no/n");continue;}sort(s, s + m, cmp);sum /= 4;            memset(mark, true, sizeof(mark));        if(DFS(0, 0, 0))printf("yes/n");else printf("no/n");    }    return 0;}


0 0
原创粉丝点击