int size; int d; bool subjects[21]; bool operator<(const setCourse sc)const{ for(int i=0;i<size;i++){ if(subjects[i]<sc.subjects[i]) return true; if(subjects[i]>sc.subjects[i]) return false; } return false; } void setData(bool* ss,int s,int deep){ size=s; for(int i=0;i<s;i++) subjects[i]=ss[i]; d=deep; }
scanf("%d %d",&n,&u); while(n!=0 || u!=0) { setMap(); scanf("%d %d",&n,&u); }
scs.clear(); int m,t; ans=200; for(int i=0;i<n;i++){ subjectOK[i]=false; scanf("%d %d",&subjectC[i],&m); subjectSet[i].clear(); for(int j=0;j<m;j++){ scanf("%d",&t); subjectSet[i].push_back(t); } } printf("%d\n",saiki(0,0));
if(sum>=u){ ans=deep<ans ? deep:ans; return deep; } setCourse sc; sc.setData(subjectOK,n,0); sit=scs.find(sc); if(sit!=scs.end()) return (*sit).d; std::vector<int>::iterator it; bool nextOK; int d=200; for(int i=0;i<n;i++){ if(subjectOK[i]==true) continue; nextOK=true; it=subjectSet[i].begin(); while(it!=subjectSet[i].end()){ if(subjectOK[(*it)]==false){ nextOK=false; break; } it++; } if(nextOK==false) continue; subjectOK[i]=true; d=std::min(d,saiki(deep+1,sum+subjectC[i])); subjectOK[i]=false; } sc.setData(subjectOK,n,d); scs.insert(sc); return d;
scanf("%d %d",&n,&m); while(n!=0 || m!=0){ setMap(); scanf("%d %d",&n,&m); }
connects.clear(); endFlag=false; ans=2000000000; for(int i=0;i<n+m;i++){ for(int j=0;j<m;j++)map[i][j]=0; } for(int i=0;i<n;i++)connects.insert(i); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%d",&map[i][j]); } } for(int i=0;i<m-1;i++){ for(int j=i+1;j<m;j++){ scanf("%d",&map[i+n][j]); map[j+n][i]=map[i+n][j]; } } saiki(0,0); printf("%d\n",ans);
connects.insert(no); if(connects.size()==(unsigned int)(n+m)){ endFlag=true; ans=std::min(sum,ans); return; } std::set<int>::iterator it; it=connects.begin(); int t=10000,nextNo=-1; while(it!=connects.end()){ for(int i=0;i<m;i++){ if(connects.find(i+n)==connects.end() && map[*it][i]>0){ if(t>map[*it][i]){ t=map[*it][i]; nextNo=i+n; } } } it++; } if(nextNo>0){ saiki(nextNo,sum+t); if(endFlag==true) return; }
char t1[4001],t2[4001]; int memo[2][4001]; int len1,len2; int num; while(scanf("%s",t1)!=EOF){ scanf("%s",t2); len1=strlen(t1); len2=strlen(t2); num=0; for(int i=0;i<len1;i++)memo[0][i]=0; for(int i=1;i<=len2;i++){ memo[i%2][0]= t2[i-1]==t1[0] ? 1:0; for(int j=1;j<len1;j++){ if(t2[i-1]==t1[j]){ memo[i%2][j]=memo[(i+1)%2][j-1]+1; num=memo[i%2][j]>num ? memo[i%2][j]:num; }else{ memo[i%2][j]=0; } } } printf("%d\n",num); }
int n,x; setSo(); scanf("%d %d",&n,&x); while(n!=0 && x!=0){ calc(n,x); scanf("%d %d",&n,&x); }
int foods[31]; for(int i=0;i<n;i++){ scanf("%d",&foods[i]); } std::sort(foods,foods+n); int p,max=0; sums[0]=true; for(int i=1;i<=x;i++){ sums[i]=false; p=0; while(foods[p]<=i && p<n){ if(sums[i-foods[p]]==true){ sums[i]=true; break; } p++; } if(sums[i]==true && so[i]==true){ max=i; } } if(max>0){ printf("%d\n",max); }else{ printf("NA\n"); }
for(int i=2;i<1000001;i++) so[i]=i%2; int k; for(int i=3;i<1000001;i+=2){ if(so[i]==true){ k=i*2; for(int j=i*3;j<1000001;j+=(k)){ so[j]=false; } } } so[0]=true; so[1]=false; so[2]=true;
int n; scanf("%d",&n); while(n!=0){ setMap(n); scanf("%d",&n); if(n==0) break; printf("\n"); }
int d[4],ans[4]; int sum,coinSum; int ansSum=1000; for(int i=0;i<4;i++) scanf("%d",&d[i]); for(int i=0;i<=d[0];i++){ for(int j=0;j<=d[1];j++){ for(int k=0;k<=d[2];k++){ for(int l=0;l<=d[3];l++){ sum=(i*10+j*50+k*100+l*500); if(sum-n>=0){ coinSum=-(i+j+k+l); coinSum+=calcTuriSen(sum-n); if(coinSum<ansSum){ ansSum=coinSum; ans[0]=i; ans[1]=j; ans[2]=k; ans[3]=l; } } } } } } int coins[]={10,50,100,500}; for(int i=0;i<4;i++){ if(ans[i]>0){ printf("%d %d\n",coins[i],ans[i]); } }
int ans=0; ans=s/500; s%=500; ans+=s/100; s%=100; ans+=s/50; s%=50; ans+=s/10; s%=10; ans+=s/5; s%=5; ans+=s; return ans;
char t; for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ scanf(" %c",&t); if(t=='.'){ map[i][j]=1; }else{ map[i][j]=0; } } } for(int i=0;i<=h;i++)map[i][0]=map[i][w+1]=0; for(int i=0;i<=w;i++)map[0][i]=0;
int lp,rp,cp,sum=0,max=0; for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ if(map[i][j]!=0) map[i][j]=map[i-1][j]+1; } for(int j=1;j<=w;j++){ if(map[i][j]!=0){
cp=map[i][j]; lp=rp=1; while(map[i][j-lp]>=cp) lp++; while(map[i][j+rp]>=cp) rp++; sum=cp*(rp+lp-1); max=max<sum ? sum:max; } } } printf("%d\n",max);
int w,h; scanf("%d %d",&h,&w); while(h!=0 && w!=0){ setMap(h,w); scanf("%d %d",&h,&w); }
int n; while(scanf("%d",&n)!=EOF){ setMap(n); }
int hp[10]; int lens[10]; int i=0; std::list<int>::iterator it; it=homePerm.begin(); while(it!=homePerm.end()){ hp[i]=(*it); it++; i++; } for(int i=0;i<n;i++) lens[i]=0; for(int i=0;i<n;i++) { for(int j=0;j<i;j++) { lens[i]=std::max(lens[i],lens[j]+map[hp[i]][hp[j]]); } } return lens[n-1];
if(n==deep){ if(ans==-1){ ans=calcLen(homePerm,deep); }else{ ans=std::min(ans,calcLen(homePerm,deep)); } return ; } int tempAns=-1; std::list<int> homePermCand[11][100]; int ansCount[11]; for(int i=0;i<11;i++) ansCount[i]=0; std::list<int>::iterator it; std::list<int>::iterator it2; int t; bool endFlag=false; int tempPerm[11]; it=homePerm.begin(); for(int i=0;it!=homePerm.end();i++){ tempPerm[i]=(*it); it++; } bool skipFlag; for(int k=0;k<n;k++) { skipFlag=false; for(int l=0;l<deep;l++){ if(k==tempPerm[l]) skipFlag=true; } if(skipFlag==true) continue; it=homePerm.begin(); endFlag=false; while(endFlag==false) { it2=homePerm.insert(it,k); t=calcLen(homePerm,deep); if(tempAns==-1){ tempAns=t; homePermCand[k][ansCount[k]]=homePerm; ansCount[k]++; }else if(tempAns==t){ homePermCand[k][ansCount[k]]=homePerm; ansCount[k]++; }else if(tempAns>t){ tempAns=t; homePermCand[k][0]=homePerm; ansCount[k]=1; } homePerm.erase(it2); if(it==homePerm.end()){ endFlag=true; }else{ it++; } } } for(int k=0;k<deep;k++){ for(int i=0;i<ansCount[k];i++){ saiki(homePermCand[k][i],n,deep+1); } }
for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ //データの読み込み scanf("%d",&map[i][j]); } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ //より遠ざけたい人を基準に map[i][j]=map[j][i]=std::max(map[i][j],map[j][i]); } } ans=-1; std::list<int> homePerm; homePerm.clear(); if(n==1){ printf("0\n"); }else{ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(i!=j){ homePerm.clear(); homePerm.push_back(i); homePerm.push_back(j); saiki(homePerm,n,2); } } } printf("%d\n",ans); }
int n; while(scanf("%d",&n)!=EOF){ setMap(n); }
int map[10][10]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ //データの読み込み scanf("%d",&map[i][j]); } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ //より遠ざけたい人を基準に map[i][j]=map[j][i]=std::max(map[i][j],map[j][i]); } } int lens[10];//ある並びで家が並んだ時の各人の家の位置 int *hp=new int[n];/各人の家の並び順 int min=2100000000;//21億 for(int i=0;i<n;i++) hp[i]=i; do{ for(int i=0;i<n;i++) lens[i]=0; //各人の家が特定の並び順になった時、家をぎちぎちに詰めた場合の最短の長さを求める処理 for(int i=0;i<n;i++) { for(int j=0;j<i;j++){ lens[i]=std::max(lens[i],lens[j]+map[hp[i]][hp[j]]); } } min=std::min(lens[n-1],min); }while(std::next_permutation(hp, hp+n));//家の全ての並び順を求める printf("%d\n",min);//答え delete [] hp;