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

弄了三个小时终于AC,但是却过不了bt数据,贴一下代码~

Posted by gamy at 2009-08-24 15:41:58 on Problem 1011
//好像我也没怎么剪枝,只是判断如果相同的两根只取一根……
可能是测试数据过于简单了吧,再bt一些就AC不了了~

5742954 gamy 1011 Accepted 240K 16MS C++ 1172B 2009-08-24 15:35:00 

#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;

int LEN,NUM;
int sticks[70];
int cp[70];
bool used[70];
int n;

bool dfs(int s,int f)
{
	

	while((sticks[s]==n)||(!used[s]))
	{
		s++;
		f=s+1;
	}
	if(s>=NUM)
		return true;
	int i;
	int pre=-1;
	for(i=f;i<=NUM;i++)
	{
		if(used[i]&&(sticks[s]+sticks[i]<=n)&&(sticks[i]!=pre))
		{
			pre=sticks[i];
			sticks[s]+=sticks[i];
			used[i]=false;
			if(dfs(s,i))
				return true;
			sticks[s]-=sticks[i];
			used[i]=true;
		}
	}
	return false; 
}

void intcpy()
{
	int i;
	for(i=1;i<=NUM;i++)
		sticks[i]=cp[NUM-i+1];
}

int main()
{
	cin>>NUM;
	while(NUM!=0){
	LEN=0;
	int i;
	for(i=1;i<=NUM;i++)
	{
		cin>>cp[i];
		LEN+=cp[i];
	}
	sort(cp+1,cp+NUM+1);
	n=0;
	for(i=1;i<=NUM;i++)
		if(n<cp[i])
			n=cp[i];
    int len=LEN;
	bool flag=false;
	for(;n<=len;n++)
	{         
		if(len%n==0)
		{
			memset(used,true,sizeof(used));
			LEN=len;
			intcpy();
			sticks;
			if(dfs(1,2))
			{
				cout<<n<<endl;
				flag=true;			
			}
			if(flag)
				break;
		}
		if(flag)
			break;
	}
	cin>>NUM;
	}
	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