| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
我是用搜索作的,下面是源代码。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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator