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

Re:对没AC的同学一点提示

Posted by microQ at 2008-12-02 22:47:59 on Problem 1011
In Reply To:对没AC的同学一点提示 Posted by:PlayerZ at 2008-08-07 08:58:43
#include <iostream.h>
#include <memory.h>
#include <stdlib.h>
int T, S;
int L;
int anLength[65];
int anUsed[65];
int i,j,k;
int Dfs(int nUnusedSticks, int nLeft);
int MyCompare( const void * e1, const void * e2)
{
	return *((int *)e2) - *((int *)e1);
}

int main()
{
	while(1)
	{
		cin >> S;
		if( S == 0 )
			break;
		int nTotalLen = 0;
		for( int i = 0; i < S; i ++ )
		{
			cin >> anLength[i];
			nTotalLen += anLength[i];
		}
		qsort(anLength,S,sizeof(int),MyCompare);
	 for( L = anLength[0]; L <= nTotalLen / 2; L ++ )
	 {
		if( nTotalLen % L)
			continue;
		memset( anUsed, 0,sizeof(anUsed));
		if( Dfs( S,L))
		{
			cout << L << endl;
			break;
		}
	 }
	if( L > nTotalLen / 2 )
		cout << nTotalLen << endl;
    } // while
    return 0;
}

int Dfs( int nUnusedSticks, int nLeft)
// nLeft表示当前正在拼的棍子和 L 比还缺的长度
{
	if( nUnusedSticks == 0 && nLeft == 0 )
		return true;
	if( nLeft == 0 ) //一根刚刚拼完
		nLeft = L;  //开始拼新的一根
	for( int i = 0;i < S;i ++)
	{
		if( !anUsed[i] && anLength[i] <= nLeft)
		{
			if( i > 0 )
			{
				if( anUsed[i-1] == false 
				   && anLength[i] == anLength[i-1])
					continue; //剪枝3
			}
			anUsed[i] = 1;
			if ( Dfs( nUnusedSticks - 1,
				 nLeft - anLength[i]))
				return true;
			else {
				anUsed[i] = 0;//说明不能用i作为
						//第1条,
						//那么要拆以前的
						//棍子,i还可能用
						//在以前的棍子里,
					     //因此要 anUsed[i] = 0;
				if( anLength[i] == nLeft || nLeft == L)
					return false;//剪枝2、1
			}
		}
	}
	return false;
}

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