hdu1059 Dividing 搜索

来源:互联网 发布:自己拍婚纱照 知乎 编辑:程序博客网 时间:2024/06/04 19:47

题目分析:一直没想的好的好的状态设置....这个真的不会写,还是有空多看看深搜吧............

//*****#include<iostream>#include<cstdio>using namespace std;int halfvalue;int a[7],sum,SUM,flag;void dfs(int v,int pre)//用当前的所组成的价值当做一个状态量{                      //参考了别人的代码....这个pre状态设置的太巧了if(flag==1)    //值得好好学习!!!return;    if(v==halfvalue){flag=1;return;}for(int i=pre;i>=1;i--){       if(a[i]!=0)   {   if(v+i<=halfvalue)   {   a[i]--;//为啥这样???   dfs(v+i,i);   if(flag==1)   break;   }   }}return;}int main(){int c=1;while(1){sum=0,SUM=0;for(int i=1;i<=6;i++){scanf("%d",&a[i]);sum+=a[i];SUM+=i*a[i];}if(sum==0)break;        if(SUM%2==1){            printf("Collection #%d:\nCan't be divided.\n\n",c++);continue;}flag=0;        halfvalue=SUM/2;dfs(0,6);if(flag==1)printf("Collection #%d:\nCan be divided.\n\n",c++);elseprintf("Collection #%d:\nCan't be divided.\n\n",c++);}    system("pause");return 0;}