poj1014--貪心算法,dfs

參考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;
		}
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章