BZOJ3172 天平 【例题精讲】

    题意:给出若干个砝码,一个最大限度,问不超过最大限度,砝码能组成的最大质量;
    题意很简单,是一道类似动态规划的题,但还不知道动态规划能不能做,此处讲解深搜做法;
    简单搜索加一两个小剪枝,我们输入砝码质量时,存一下前n个砝码的质量和,以备剪枝用;
    下面说剪枝;
1.我们可以选择从大到小的枚举顺序,如果现在的质量大于限度,那就直接进入下一层循环;
2.如果目前的质量加上提供的所有总和都比目前已经搜过的答案小,那么直接回溯;
3.边界要找准,这题忒简单,就这样吧;
      好,下面上代码;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<queue>
 6 #include<string>
 7 #include<algorithm>
 8 #include<queue>
 9 #include<stack>
10 #include<set>
11 using namespace std;
12 const int MAXN=1005;
13 long long provide[MAXN];
14 long long sum[MAXN];
15 long long n,m,c;
16 long long ans=0;
17 void dfs(int now,int nl)
18 {
19     if(nl>ans)ans=nl;
20     if(now<1) return ;
21     for(int i=now;i>0;i--){
22         if(provide[i]>c)continue;
23         if(sum[i]+nl<ans) return;
24         if(nl+provide[i]<=c)
25         dfs(i-1,nl+provide[i]);
26     }
27     return ;
28 }
29 int main()
30 {
31     scanf("%d%d",&n,&c);
32     for(int i=1;i<=n;i++){
33         scanf("%d",&provide[i]);
34         sum[i]=sum[i-1]+provide[i];
35     }
36     dfs(n,0);
37     cout<<ans<<endl;
38     return 0;
39 }
View Code

 

posted @ 2018-04-05 10:14  杜宇一声  阅读(107)  评论(0编辑  收藏  举报