题意:给定N个数,选不超过4个数计算(可重复选取)其和,但和不能超过M,
求最大和为多少
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1010],n,m,s;
int cmp(int a,int b)
{
return a>b;
}
void dfs(int i,int sum,int gs) //i为将要计算的数组元素的下标,sum为和,gs为将要加第几个数
{
if(sum>s) //当计算的和比最大值大,将和的最大值更新
s=sum;
if(i>=n||sum==m||gs>4||sum+a[i]*(5-gs)<=s) //5-gs表示当前还需要加几个数,若sum+a[i]*(5-gs)比最大值小,
return ; //因为接下来的数比a[i]更小,最后的和肯定比最大值也小
if(sum+a[i]<=m)
dfs(i,sum+a[i],gs+1);
if(sum<=m)
dfs(i+1,sum,gs);
}
int main()
{
int i,k=0;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0)
break;
k++;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n,cmp);
s=a[n-1];
dfs(0,0,1);
printf("Case %d: %d\n\n",k,s);
}
return 0;
}