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 cc at 2003-09-11 13:38:01 on Problem 1010
In Reply To:呵呵,你用什么方法做的 Posted by:hawk at 2003-09-10 21:41:42
#include<iostream>
#include<memory>
#include<algorithm>
#include<cstdio>

using namespace std;

int stamp[30];
int test[30];
int best[30];
int type;
int value;
int testval;
int savetype;
int num;

int cmp(const void *arg1,const void *arg2)
{
	return *(int *)arg1-*(int *)arg2;
}

bool tie;

void isbetter()
{
	if(type>savetype||(type==savetype&&num<best[0]))
	{
		tie=false;
		savetype=type;
		best[0]=num;
		memcpy(best+1,test+1,sizeof(int)*25);
	}
	else if(type==savetype&&num==best[0])
	{
		int i;
		int j;
		for(i=stamp[0];i>=1;i--)
		{
			if(test[i]!=0)
				break;
		}
		for(j=stamp[0];j>=1;j--)
		{
			if(best[j]!=0)
				break;
		}
		if(i>j)
		{
			tie=false;
			savetype=type;
			best[0]=num;
			memcpy(best+1,test+1,sizeof(int)*25);
		}
		else if(i==j)
			tie=true;
	}
}

void backtrack(int i)
{
	int j;
	if(i>stamp[0])
		return ;
	//
	if(testval==value&&value!=0)
	{
		isbetter();
		return ;
	}
	//
	for(j=1;j<=4-num;j++)
	{
		if(j==1)
			type++;
		num+=j;
		test[i]=j;
		int temp=j*stamp[i];
		testval+=temp;
		
		if(num>4||testval>value)
		{
			testval-=temp;
			num-=j;
			break;
		}
		
		if(num==4)
		{
			if(testval==value)
				isbetter();
			
			testval-=temp;
			num-=j;
			break;
		}
		else
		{
			if(testval==value)
			{
				isbetter();
				testval-=temp;		num-=j;		break;
			}
			else
				backtrack(i+1);
		}
		testval-=temp;
		num-=j;
	}
	//fresh
	test[i]=0;
	type--;
	if(value-testval>=stamp[i+1])
		backtrack(i+1);
}

int main()
{
	freopen("d:\\pku1010.in","r",stdin);
	//freopen("d:\\pku1010.out","w",stdout);
	while(cin>>stamp[1])
	{
		int i;
		for(i=2;stamp[i-1];i++)
		{
			scanf("%d",stamp+i);
		}
		stamp[0]=i-2;//stamp typenum
		//qsort by value
		qsort(stamp+1,stamp[0],sizeof(int),cmp);
		//input need value
		while(1)
		{
			scanf("%d",&value);
			if(value==0)
				break;
			//initialize			
			type=0;
			savetype=0;
			testval=0;
			num=0;
			tie=false;
			memset(test,0,sizeof(test));
			memset(best,0,sizeof(best));
			//
			backtrack(1);
			//disp
			printf("%d",value);
			if(best[0]==0)
				printf(" ---- none\n");
			else if(tie==true)
			{
				printf(" (%d): tie\n",savetype);
			}
			else
			{
				int cc=0;
				printf(" (%d): ",savetype);
				for(cc=0,i=1;i<=stamp[0];i++)
				{
					int j;
					for(j=1;j<=best[i]&&cc<best[0];j++)
					{
						printf("%d",stamp[i]);
						cc++;
						if(cc<best[0])
							printf(" ");
					}
				}
				printf("\n");
			}
		}
	}
	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