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