做的过程有个疑问,要不要建一个4倍于原来价格的数组,其中前四个相同等于第一个原来的价格,后来发现这样会导致tie,所有就放弃这种做法,后面用了一个for(j)循环搞定了
for(i=a+1;i<=n;i++){
for(int j=1;j<=4;j++){
验证答案都对了,提交时,提示超时,看了人家的代码,之后发现,自己的代码无论怎么输入都不会结束,所以也借用了人家代码中的一个语句
if(scanf("%d",&a)==EOF)exit(0);
我的代码,ACCEPT
#include "iostream" #include "string.h" #include "algorithm" using namespace std; int data[1000],bestlei=0,bestliang=0,bestmax=0,flag,x,n,set[1000],list[1000],p[1000],man[1000],y; int check(){ int i,tem=0; for(i=1;i<=n;i++){ if(set[i])tem++; } if(tem>bestlei){bestlei=tem;return 0;} else if(tem==bestlei){return 1;} else return 2; } void chang(int a){ int i; x=a; for(i=1;i<=a;i++){ list[i]=data[i]; } } void dfs(int a,int step,int sum){ int i; if(sum>y)return; if(step>4)return; if(sum==y){ int tem=check(); if(tem==0){ chang(step); bestliang=step; bestmax=p[a]; flag=0; } else if(tem==1){ if(step<bestliang){ chang(step); bestliang=step; bestmax=p[a]; flag=0; } else if(step==bestliang){ if(p[a]>bestmax){ chang(step); bestmax=p[a]; flag=0; } else if(p[a]==bestmax){flag=1;} } } return; } for(i=a+1;i<=n;i++){ for(int j=1;j<=4;j++){ set[i]=1; data[step+j]=p[i]; dfs(i,step+j,sum+p[i]*j); set[i]=0; } } } int main(){ int a,i,top,num[1000]; while(true){ top=1; while(true) { if(scanf("%d",&a)==EOF)exit(0); if(a==0)break; p[top++]=a;} n=top-1; sort(p+1,p+n+1); top=1; while(cin>>a&&a){man[top++]=a;} for(i=1;i<top;i++){ memset(set,0,sizeof(set)); flag=2; y=man[i]; bestlei=0;bestliang=0;bestmax=0; dfs(0,0,0); if(flag==1)cout<<man[i]<<" ("<<bestlei<<"):"<<" tie"<<endl; else if(flag==0){ cout<<man[i]<<" ("<<bestlei<<"):"; for(int j=1;j<=x;j++){ cout<<' '<<list[j]; } cout<<endl; } else { cout<<man[i]<<" ---- "<<"none"<<endl; } } } }