zoj 3631Watashi's BG

主要错在一个地方: 本以为输入的每个数大于M就一定要被排除掉,但是,如果排除掉,在dfsI()里 大于M的数可以不取,而step却可以加一,这种情况漏掉了。

#include<iostream>
#include<cstdio>
using namespace std;
int N,M,Max,k;
int a[40];
int flag;
void dfs(int step,int sum)
{
    if(flag)return;
    if(sum>M)return;
    //if(a[step]>M)return;
     if(step>=k)
     {
         Max = max(Max,sum);
         return ;
     }
    if(sum+a[step]<=M)
    Max = max(Max,sum+a[step]);
    if(sum+a[step]==M)
    {
        Max = M;
        flag=1;
    }
    if(flag)return;
    dfs(step+1,sum+a[step]);
    dfs(step+1,sum);


    return ;
}
int main()
{
    while(scanf("%d%d",&N,&M)!=EOF)
    {
        Max=0;
        int d;
        int maxn=0;
        int sum=0;
        k=0;
        for(int i=0;i<N;i++)
         {
             scanf("%d",&d);
             sum+=d;
             if(d>maxn)
               maxn = d;
             //if(d<=M)
             {
                 a[k++]=d;
             }
         }
         if(sum<=M)
         {
             printf("%d\n",sum);
             continue;
         }
         else if(maxn==M)
         {
            printf("%d\n",M);
            continue;
         }
         flag=0;
        dfs(0,0);
        printf("%d\n",Max);

    }
}

猜你喜欢

转载自zhouxiaojie.iteye.com/blog/1611717
ZOJ