參考http://blog.csdn.net/justmeh/article/details/5806601和http://www.cnblogs.com/linpeidong2009/archive/2012/04/21/2461609.html
/*Problem: 1014
Memory: 320K Time: 16MS
Language: C++ Result: Accepted */
Source Code
#include<stdio.h>
#include<string.h>
#define VALUE_NUM 6
void dfs(int value);//傳入當前已有的value,用貪心算法累加,當等於mean_value時設置flag值爲1,函數返回,表示可以分
int flag;//爲1,表示可以分,爲0表示不可以分
int m_num[VALUE_NUM];//store the number of marbles in different value
int mean_value;
int main()
{
int i, j;
int total_value, value;
int case_num = 0;//record the number of test case
while(1)
{
scanf("%d %d %d %d %d %d", &m_num[0], &m_num[1], &m_num[2], &m_num[3], &m_num[4], &m_num[5]);
total_value = 0;
for(i=0; i<VALUE_NUM; i++)
{
total_value += m_num[i]*(i+1);
}
if(total_value==0)
break;
case_num++;
if(total_value%2 != 0)//total value is odd
{
printf("Collection #%d:\nCan't be divided.\n\n", case_num);
}
else//total value is even
{
mean_value = total_value/2;
value = 0;
flag = 0;
dfs(value);
if(flag)
printf("Collection #%d:\nCan be divided.\n\n", case_num);
else
printf("Collection #%d:\nCan't be divided.\n\n", case_num);
}
}
return 0;
}
void dfs(int value)
{
int i;
if(value==mean_value)
{
flag = 1;
return;
}
for(i=VALUE_NUM-1; i>=0; i--)
{
if(mean_value-value>=i+1 && m_num[i]>0)//如果value還未到達mean_value,且它們的差值大於等於當前的價值
{
value += i+1;
m_num[i]--;
dfs(value);
if(flag)
return;
}
}
}