Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

好混乱

Posted by javvy at 2011-06-11 18:35:06 on Problem 1011
#include <iostream>
using namespace std;
int n;
int *a;
int sum;
int *used;
bool dfs(int start,int sum,int len);
bool can(int len);

void sort()
{
	for(int i=0;i<n;i++)
		for(int j=i+1;j<n;j++)
		{
			if(a[i]<a[j])
			{
				int temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
}

int getsum()
{
	int sum = 0;
	for(int i=0;i<n;i++)
		sum += a[i];
	return sum;
}

bool dfs(int begin,int now,int sum,int len)
{
	used[begin] = 1;
	
	if(sum>len||now==n-1&&sum!=len)
	{
		return false;
	}
	if(sum==len)
	{
		int start = -1;
		for(int i=0;i<n;i++)
			if(!used[i])
			{
				start = i;
				break;
			}
		if(start!=-1)
		{		
			return dfs(start,start,a[start],len);
		}
		if(start==-1)
		{
			return true;
		}
	}

	bool temp = true;
	int last;
	for(int i=now+1;i<n;i++)
	{
		if(used[i])
			continue;
		if(temp==false&&a[i]==a[last])
			continue;
		used[i] = 1;
		temp = dfs(begin,i,sum+a[i],len);
		last = i;
		if(temp==true)
			return true;
		
		used[i] = 0;
	}
	
	used[begin] = 0;
	return false;	
}



int getMin()
{

	for(int i=a[0];i<=sum/2;i++)
	{
		if(sum%i!=0)
			continue;
		for(int j=0;j<n;j++)
			used[j] = 0;
		if(dfs(0,0,a[0],i))
			return i;
	}
	return sum;
}

int main()
{
	while(1)
	{
		cin>>n;
		a = new int[n];
		used = new int[n];
		if(n==0)
			break;
		for(int i=0;i<n;i++)
		{
			cin>>*(a+i);
			used[i] = 0;
		}
		sum = getsum();
		sort();
		cout<<getMin()<<endl;
		delete a;
		delete used;
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator