深搜经典。 #include<iostream> #include<string> #include<algorithm> using namespace std; int d[23],stick[23],sum[23]; int N,L,K; int ans; bool cmp(int a,int b) { return a>b; } void DFS(int c,int s,int k) { int i; if(s+sum[c]<=ans) return ;//剪枝 if(c==N) { ans=s; return; } for(i=0;i<k;i++)//尝试将d[c]放进前k根木棒 if(stick[i]+d[c]<=L) { stick[i]+=d[c]; DFS(c+1,s+d[c],k); stick[i]-=d[c]; } if(k<K)//如果还达不到要求,增加一根木棒 { stick[k]+=d[c]; DFS(c+1,s+d[c],k+1); stick[k]-=d[c]; } DFS(c+1,s,k);//舍弃当前根,尝试其他d[] } int main() { int i; while(scanf("%d %d %d",&N,&L,&K)!=EOF) { for(i=0;i<N;i++) scanf("%d",&d[i]); sort(d,d+N,cmp); sum[N]=0; for(i=N-1;i>=0;i--) sum[i]=d[i]+sum[i+1]; ans=0; DFS(0,0,0); printf("%d/n",ans); } return 0; }