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 fisheatscats at 2007-10-29 11:58:26 on Problem 1011
#include <iostream>
#include <algorithm>

using namespace std;

const int maxv=64+5;

int n,len[maxv],used[maxv],dp[50*maxv+100],visited[50*maxv+100],part,sum,nowlen,ans;
bool cmp(int a,int b)
{
	return a>=b;
}

int main()
{
	while (scanf("%d",&n) && n>0)
	{
		sum=0;
		for (int i=1;i<=n;i++) scanf("%d",&len[i]);
		for (int i=1;i<=n;i++) sum+=len[i];
	
		sort(len+1,len+n+1,cmp);	
		ans=0;
		
	    for (int part=n;part>1;part--)
		if (ans==0)
		if (sum%part==0)
		{
			int ok=1,t;
			nowlen=sum/part;
			
			memset(used,0,sizeof(used));	
			
			for (int k=1;k<=part;k++)
			if (ok==1)
			{
				memset(dp,0xFF,sizeof(dp));
			
				for (int i=1;i<=n;i++)
					if (used[i]==0)
					{
						memset(visited,0,sizeof(visited));
						for (int j=nowlen-len[i];j>=0;j--)
							if (j==0 )
							{
							   if (dp[len[i]]==-1) dp[len[i]]=0;
							}
							else if (j>0)
								if (dp[j]>=0 && dp[j+len[i]]==-1)
								{
								   dp[j+len[i]]=j;
								}
					}
						
				if (dp[nowlen]>=0)
				{
					int temp=nowlen;
					while (dp[temp]>=0)
					{
						t=temp-dp[temp];		
						int p=1;
						while (len[p]!=t || used[p]==1 ) p++;
						temp=dp[temp];
						used[p]=1;
					}
				}
				else ok=0;
				
			}
	
			if (ok==1) ans=nowlen; 
		}
	    
		if (ans==0) ans=sum;
		cout<<ans<<endl;
	}
	
	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