poj 3172 Scales 搜索

其实这个题目要是注意到了题目的一点关键性的描述就会变得很简单,题意是给出的砝码是至少是前两个的和的,有了这一点,那么砝码的数量应该就在几十左右,这样的话适当剪枝的搜索是应该可以过的。

 

#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std;

const int maxn=1e3+9;

unsigned int a[maxn];

int n,c;

long long ans,sum[maxn];

void dfs(int t,long long ret)

{

    if(ret>ans) ans=ret;

    if(t<1) return ;

    for(int i=t;i>=1;i--)

    {

        if(ret+a[i]<=c)

        {

            if(ret+sum[i]>ans)

            dfs(i-1,ret+a[i]);

        }

    }

}



int main()

{

//    freopen("in.txt","r",stdin);

    while(scanf("%d %d",&n,&c)!=EOF)

    {

        ans=0;

        sum[0]=0;

        for(int i=1;i<=n;i++)

        {

            scanf("%u",&a[i]);

            sum[i]=sum[i-1]+a[i];

        }

        dfs(n,0);

        cout<<ans<<endl;

    }

    return 0;

}


 

 

你可能感兴趣的:(poj)