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

 

转载于:https://www.cnblogs.com/Alan-Luo/articles/8721318.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值