#include<iostream> #include<set> using namespace std; int tmax;//当前得到的值 int num,mmax; int maxx; //当前下得到的最大值 struct myComp { bool operator()(const int &a,const int &b) { if(a!=b) return a>b; else return a>b; } }; set<int,myComp> s; void DFS(int minnum,int k) { if(tmax>maxx)maxx=tmax; if(k==4)return ; set<int,myComp>::iterator it; for(it=s.begin();it!=s.end();it++) { if(*it>minnum) continue; else if(tmax+(*it)>mmax)continue; else if((tmax+(*it)*(4-k))>maxx)tmax+=(*it),DFS((*it),k+1),tmax-=(*it); else return ; } } int main() { int count=0; while(++count) { cin>>num>>mmax; if(num==0&&mmax==0)return 1; for(int i=0;i<num;i++) { int temp; cin>>temp; if(temp<mmax)s.insert(temp); } tmax=0;maxx=0; DFS((*s.begin()),0); s.clear(); cout<<"Case "<<count<<": "<<maxx<<endl<<endl; } return 1; } 这个是我在vc6.0下的可行程序! #include<iostream> #include<set> using namespace std; int tmax;//当前得到的值 int num,mmax; int maxx; //当前下得到的最大值 struct myComp { bool operator()(const int &a,const int &b) { if(a!=b) return a>b; else return a>b; } }; set<int,myComp> s; void DFS(int minnum,int k) { if(tmax>maxx)maxx=tmax; if(k==4)return ; set<int,myComp>::iterator it; for(it=s.find(minnum);it!=s.end();it++) { if(tmax+(*it)>mmax)continue; else if((tmax+(*it)*(4-k))>maxx)tmax+=(*it),DFS((*it),k+1),tmax-=(*it); else return ; } } int main() { int count=0; while(++count) { cin>>num>>mmax; if(num==0&&mmax==0)return 1; for(int i=0;i<num;i++) { int temp; cin>>temp; if(temp<mmax)s.insert(temp); } tmax=0;maxx=0; DFS((*s.begin()),0); s.clear(); cout<<"Case "<<count<<": "<<maxx<<endl<<endl; } return 1; } 这个是在vs2010下的可执行程序